;-> AmySequencer2 by Stefano Maria Regattin
;d> 19 gennaio 2002 da AmySequencer
;m> 20,21,22,23,24,26,30,31 gennaio 2002
;m> 1,2,3,4,5,6,7,9,10,11,13,15,16,17,18,19,20,22,23,24,27,28 febbraio 2002
;m> 1,2,3,4,5,6,7,8,10,11,13,14,15,16,18,19,20,21,22,23,24,25,26,27,28,31 marzo 2002
;m> 1,2,4,5,6,8,9,10,11,13,14,19,20,21,22,24,25,28,29,30 aprile 2002
;m> 4,5,6,8,9,10,11,12,13,14,15,17,18 maggio 2002
;m> 12,14,15,16,17,20,22,23,28,30 giugno 2002
;m> 1,3,4,5,9,10,13,15,16 luglio 2002
;m> 10,13,14,23 agosto 2002
;m> 2,5,22 settembre 2002
;m> 8,9,12,16,17,18,20,21,22 ottobre 2002
;-----------------------------------------

;-----------------------
;versione del programma
;program version
;----------------
Versione$="$VER: AmySequencer 0.13 (22.10.2002)"

;------------------------------------------
;dati per i colori originali dello schermo
;original screen colours data
;-----------------------------
Data.b 0,0,0
Data.b 4,4,4
Data.b 8,8,8
Data.b 12,12,12
Data.b 12,0,0
Data.b 12,6,0
Data.b 12,12,0
Data.b 6,12,0
Data.b 0,12,0
Data.b 0,12,6
Data.b 0,12,12
Data.b 0,6,12
Data.b 0,0,12
Data.b 6,0,12
Data.b 12,0,12
Data.b 12,0,6

;------------------------------------------------------------------------
;il seguente comando indica dove si trovano sul vostro computer i codici
; sorgenti di Blitz2 da includere in questo programma
;the following command states the place on your computer where are the Blitz2
; source codes to be included into this program
;-----------------------------------------------
INCDIR "Lavoro:Linguaggi/Blitz/"

;-------------------------------------------------------------------------
;questo comando inserisce una sola volta in questo punto del programma il
; codice sorgente specificato
;this command inserts one unique time in this point of the program the
; specified source code
;-----------------------
XINCLUDE "MIDIConstants.bb2"

;------------------------------------------------------------------------------
;le seguenti costanti servono per ricavare il periodo di un canale audio AMIGA
; dalla frequenza di campionamento; ce ne e' una per gli AMIGA PAL e una per
; quelli NTSC
;the following constants are used to obtain an AMIGA audio channel period from the
; sampling frequency; there is one for PAL AMIGAs and one for NTSC AMIGAs
;-------------------------------------------------------------------------

;PAL timing
#TemporizzazionePAL=3546895

;NTSC timing
#TemporizzazioneNTSC=3579545

;-------------------------------------------------------------------------
;questa costante indica il numero di riferimento della fonte di caratteri
; Topaz8
;this constant states the characters font Topaz8 referring number
;-----------------------------------------------------------------
#FonteDiCaratteriTopaz8=0

;-------------------------------------------------------------------------
;questa variabile imposta il periodo minimo per i canali audio; il limite
; per i vecchi AMIGA e' 123, ma io ho scelto un periodo minimo di 125, che
; corrisponde ad un La nella nona ottava
;this variable sets the audio channels minimum period; on the oldest AMIGA the
; lowerst usable period is 123, but I have choosen minimum period of 125, that is
; the A note in the ninth octave
;--------------------------------
#PeriodoMinimo=125

;---------------------------------------------------------------------------
;questa costante indica il numero di riferimento della tavolozza dei colori
; disponibili
;this constant states the colour palette referring number
;---------------------------------------------------------
#TavolozzaDeiColori=0

;--------------------------------------------------
;le seguenti costanti indicano il tipo di finestra
;the following constants state the window's kind
;------------------------------------------------

;window sizing gadget
#GadgetRidimensionaFinestra=1

;draggable window
#FinestraMovibile=2

;window depth gadget
#GadgetNascondiFinestra=4

;close gadget
#GadgetChiudiFinestra=8

;sizing window right border (you must set gimme-zero-zero to use it)
#BordoDestraFinestraRidimensionabile=16

;sizing window bottom border (you must set gimme-zero-zero to use it)
#BordoBassoFinestraRidimensionabile=32

;backdrop window
#FinestraDiSfondo=256

;gimme-zero-zero window
#FinestraConMemoriaSfondo=1024

;borderless window
#FinestraSenzaBordi=2048

;window active
#FinestraAttivata=4096

;------------------------------------------------
;le seguenti costanti indicano il tipo di gadget
;the following constants state the gadgets' kind
;------------------------------------------------

;invert
#InvertiGadget=1

;related to window's right side
#PosizioneRelativaAllaDestraDellaFinestra=2

;related to window'w bottom side
#PosizioneRelativaAlBassoDellaFinestra=4

;size as window's inner width
#ComeLarghezzaInternaFinestra=8

;size as window's inner height
#ComeAltezzaInternaFinestra=16

;box select
#ScatolaDaSelezionare=32

;horiziontal movement
#MovimentoOrizzontale=64

;vertical movement
#MovimentoVerticale=128

;no border
#NessunBordo=256

;exclude each other
#SiEscludonoLUnLAltro=512

;attach to window's right side
#AttaccaADestraDellaFinestra=1024

;attach to window's left side
#AttaccaASinistraDellaFinestra=2048

;attach to window's top
#AttaccaAllaFinestraInAlto=4096

;attach to window's bottom
#AttaccaAllaFinestraInBasso=8192

;gimme-zero-zero border gadget
#GadgetConMemoriaBordo=16384

;--------------------------------------------------------
;le seguenti costanti indicano gli eventi delle finestre
;the following constants state window events
;--------------------------------------------

;you have pressed a mouse button
#HaiPremutoUnTastoDelTopo=8

;you have moved the mouse
#HaiMossoIlTopo=16

;you have pressed a gadget
#HaiPremutoUnGadget=32

;you have released a gadget
#HaiRilasciatoUnGadget=64

;you have activated a menu
#HaiAttivatoIlMenu=256

;you have closed the window
#HaiChiusoLaFinestra=512

;you have pressed a key
#HaiPremutoUnTasto=1024

;--------------------------------------------------------
;le seguenti costanti indicano i tasti cliccati del topo
;the following constants state the clicked mouse buttons
;--------------------------------------------------------

;left mouse button pressed
#TastoSinistroDelTopoPremuto=1

;right mouse button pressed
#TastoDestroDelTopoPremuto=2

;left mouse button released
#TastoSinistroDelTopoRilasciato=5

;right mouse button released
#TastoDestroDelTopoRilasciato=6

;-----------------------------------------------------------------------------
;le seguenti costanti indicano il valore ascii del tasti Backspace, Esc e dei
; tasti freccia
;the following constants state the ascii value for the Backspace, Esc and
; arrow keys
;------------
#Backspace=8
#Escape=27
#CursorUp=28
#CursorDown=29
#CursorRight=30
#CursorLeft=31

;Backspace key
TastoBackspace$=Chr$(#Backspace)

;Esc key
TastoEsc$=Chr$(#Escape)

;Cursor up key
TastoCursoreSu$=Chr$(#CursorUp)

;Cursor down key
TastoCursoreGiu$=Chr$(#CursorDown)

;Cursor right key
TastoCursoreDestra$=Chr$(#CursorRight)

;Cursor left key
TastoCursoreSinistra$=Chr$(#CursorLeft)

;-----------------------------------------------------------
;le seguenti costanti indicano i bottoni del joypad premuti
;the following constants state the joypad pressed buttons
;---------------------------------------------------------
#_PlayB=1
#_ReverseB=2
#_ForwardB=4
#_GreenB=8
#_YellowB=16
#_RedB=32
#_BlueB=64

;-------------------------------------------------------------------------
;le seguenti costanti indicano la direzione scelta con il joystick/joypad
;the following constants state the choosen direction by joystick/joypad
;-----------------------------------------------------------------------
#JoyMovedUp=0
#JoyMovedRight=2
#JoyMovedDown=4
#JoyMovedLeft=6
#JoyNotMoved=8

;screen
#Schermo=0

;main window
#FinestraPrincipale=0

;main window's gadget list
#ListaGadgetPrincipale=0

;main window's menu list
#ListaMenuPrincipale=0

;sounds editor window
#FinestraEditoreSuoni=1

;sounds editor window's gadget list
#ListaGadgetEditoreSuoni=1

;sound editor window's menu list
#ListaMenuEditoreSuoni=1

;notes editor window
#FinestraEditoreSequenza=2

;notes editor window's gadget list
#ListaGadgetEditoreSequenza=2

;notes editor window's menu list
#ListaMenuEditoreSequenza=2

;note editor window's zonetable
#TabellaZoneEditoreSequenza=0

;window to change basic note length
#FinestraCambioEventoBase=3

;basic note length change window's gadget list
#ListaGadgetCambioEventoBase=3

;slider editore suoni, valore utile qualsiasi maggiore di zero
;sounds editor's slider, useful value any greater than zero
#SliderEditoreSuoni=1

;basic note change window's zonetable
#TabellaZoneCambioEventoBase=1

;background pic's bitmap
#BitmapImmagineDiSfondo=0

;-------------------------------------------------------------------------
;queste costanti indicano i cambiamenti che possono essere applicati agli
; eventi musicali
;these constants states different changes that can be applied to musical
: events
;--------

;select an event
#SelezionaUnEvento=0

;change the channel of the selected events
#CambiaIlCanaleDegliEventiMusicaliSelezionati=1

;increase by one the selected events
#AlzaDiUnoGliEventiMusicaliSelezionati=2

;decrease by one the selected events
#AbbassaDiUnoGliEventiMusicaliSelezionati=3

;move forward the selected events
#SpostaAvantiNelTempoGliEventiMusicaliSelezionati=4

;move backward the selected events
#SpostaIndietroNelTempoGliEventiMusicaliSelezionati=5

;delete the selected events
#EliminaGliEventiMusicaliSelezionati=6

;select all the events
#SelezionaTuttiGliEventiMusicali=7

;deselect all the events
#DeselezionaTuttiGliEventiMusicali=8

;toggle selection of all events
#InvertiLaSelezioneDiTuttiGliEventiMusicali=9

;select same kind's events with the same channel
#SelezionaGliEventiMusicaliUguali=10

;add 10 to the to the event value of the selected events that aren't notes
#AggiungiDieciAgliEventiMusicaliSelezionati=11

;sub 10 to the event value of the selected events that aren't notes
#SottraiDieciAgliEventiMusicaliSelezionati=12

;put up of one octave the selected notes
#AlzaDiUnOttavaLeNoteSelezionate=13

;put down of one octave the selected notes
#AbbassaDiUnOttavaLeNoteSelezionate=14

;change the value of the selected events, that is velocity for notes
#CambiaIlValoreDegliEventiMusicaliSelezionati=15

;increase the selected notes length
#AllungaLaDurataDelleNoteSelezionate=16

;decrease the selected notes length
#RiduciLaDurataDelleNoteSelezionate=17

;add a beat to selected time signature events
#AggiungiUnBattitoAlTempoSelezionato=18

;sub a beat to selected time signature events
#TogliUnBattitoAlTempoSelezionato=19

;add a measure to selected time signature events
#AggiungiUnaMisuraAlTempoSelezionato=20

;sub a measure to selected time signature events
#TogliUnaMisuraAlTempoSelezionato=21

;------------------------------------------------------------------------------
;le seguenti costanti indicano il modo di disegno delle sequenze  visualizzate
;the following constants state the displayed sequences drawing mode
;-------------------------------------------------------------------

;unselected sequence
#SequenzaNonSelezionata=0

;selected sequence
#SequenzaSelezionata=1

;highlighted sequence
#SequenzaEvidenziata=2

;----------------------------------------------------------------------------
;le seguenti costanti indicano lo stato che un evento musicale puo' assumere
;the following constants state the status that a musical event can be
;---------------------------------------------------------------------

;unselected event
#EventoMusicaleNonSelezionato=0

;selected event
#EventoMusicaleSelezionato=1

;cutted event
#EventoMusicaleTagliato=2

;copied event
#EventoMusicaleCopiato=4

;played event
#EventoMusicaleSuonato=8

;ended event
#EventoMusicaleTerminato=16

;----------------------------------------------
;queste costanti indicano come suonare le note
;these constants state how to play notes
;----------------------------------------

;execute events from the main window
#EseguiGliEventiMusicaliDallaFinestraPrincipale=0

;execute events from the sequence editor
#EseguiGliEventiMusicaliDallEditoreSequenza=1

;---------------------------------------------------------------------------
;le seguenti costanti sono usate dal comando WJam per la selezione del modo
; grafico
;the following constants are used by WJam command for the graphic mode
; selection
;-----------

;one colour with transparent background
#UnColoreConSfondoTrasparente=0

;two colours with full background
#DueColoriConSfondoPieno=1

;second time same colour
#SecondaVoltaStessoColore=2

;--------------------------------------------------------------
;le seguenti costanti indicano il tempo base che e' 4/4, cioe'
; #BattitiDiBase/#MisureDiBase
;the following constants states the basic time that is 4/4, that is
; #BattitiDiBase/#MisureDiBase
;------------------------------

;basic beats
#BattitiDiBase=4

;basic measures
#MisureDiBase=4

;tracks maximum
#MassimoTracce=1024

;sequences maximum
#MassimoSequenze=32768

;          font height, notes invisible area,   selected channel, note increment y, basic event,musical event moved by mouse
DEFTYPE .b AltezzaFonte,AreaInvisibileDelleNote,CanaleSelezionato,IncrementoYNota,  EventoBase, EventoMusicaleSpostatoConIlTopo

;          speech enabled, clicked mouse key,   visible tracks,AMIGA voice off,visible area start y
DEFTYPE .b ParlatoAttivato,TastoDelTopoCliccato,TracceVisibili,VoceSpenta,     YInizioAreaVisibile

;          editor window inner height,           editor window inner width
DEFTYPE .w AltezzaInternaFinestraEditoreSequenza,LarghezzaInternaFinestraEditoreSequenza

;          main window inner height,        main window inner width
DEFTYPE .w AltezzaInternaFinestraPrincipale,LarghezzaInternaFinestraPrincipale

;          screen height, values visible area,  Active channels,selected musical event,   screen height,   slider width
DEFTYPE .w AltezzaSchermo,AreaVisibileDeiValori,CanaliAttivati, EventoMusicaleSelezionato,LarghezzaSchermo,XLunSlider

;          bars per mins background x,tempo background x,mouse x,slider height,tempo background y,bars per mins background y
DEFTYPE .w XPosSfondoBattutePerMinuto,XPosSfondoTempo,   XTopo,  YLunSlider,   YPosSfondoTempo,   YPosSfondoBattutePerMinuto

;          mouse y
DEFTYPE .w YTopo

;          time invisible area,   sequence duration,events,selected events,  MIDI enabled,Insertion point,   sequence
DEFTYPE .l AreaInvisibileDelTempo,DurataSequenza,   Eventi,EventiSelezionati,MIDIAttivato,PuntoDiInserimento,Sequenza

;          selected sequence,  visible area start x
DEFTYPE .l SequenzaSelezionata,XInizioAreaVisibile

;----------------------------------------------------------
;questa variabile riporta la parte non visibile del motivo
;this variable reports the non visible motive area
;--------------------------------------------------
AreaInvisibileDelMotivo.l=0

;-----------------------------------------------------------------------------
;questa variabile indica la velocita' di esecuzione delle note, indicata come
; battute al minuto
;this variable states the notes execution velocity, stated as bars per minute
;-----------------------------------------------------------------------------
BattutePerMinuto.w=120

;-----------------------------------------------------
;questa variabile indica i battiti correnti del tempo
;this variable states the time's current beats
;----------------------------------------------
Battiti.b=#BattitiDiBase

;----------------------------------------------------------------------------
;la seguente variabile permette la selezione delle due diverse tavolozze dei
; colori; se vera (true), i colori saranno quelli originali, se falsa (false)
; saranno quelli dell'immagine di sfondo a colori
;the following variable permits the selection of the two different colour
; palettes; if true the colours will be as original, if false they will be
; the ones from the coloured pic
;--------------------------------
ColoriOriginali.b=False

;----------------------------------------------------------------------------
;questa costante indica il valore per cui bisogna moltiplicare o dividere la
; frequenza della nota per ricavare rispettivamente la nota successiva o la
; nota precedente e corrisponde a 2^(1/12), cioe' la radice dodicesima di 2
;this constant states the value witch it must moltiply or divide the note
; frequency to obtain respectively the following note or the previous note and
; corresponds to 2^(1/12), that is the twelfth root of 2
;--------------------------------------------------------
DistanzaSemitono.f=1.05946309

;------------------------------------------------------------------------------
;questa variabile, diventando vera (true), vi permette di uscire dal programma
;this variable, becaming True, let you exit from the program
;------------------------------------------------------------
EsciDalProgramma.b=False

;------------------------------------------
;questa variabile indica la fine del brano
;this variable states song end
;------------------------------
FineMotivo.l=0

;------------------------------------------------------------------
;questa variabile indica se e' stata aperta la finestra principale
;this flag states if the main window is opened
;----------------------------------------------
FinestraPrincipaleAperta.b=False

;------------------------------------------------------------------------------
;Questa variabile indica la larghezza di base delle note; puo' essere cambiata
; secondo i bisogni del momento
;This variable states the basic notes width; it can be changed depending of
; the needs of the moment
;-------------------------
LarghezzaEventoBase.w=192

;-----------------------------------------------------
;questa variabile indica le misure correnti del tempo
;this variable states the time's current measures
;-------------------------------------------------
Misure.b=#MisureDiBase

;------------------------------------------------------------------------
;questa variabile indica se gli eventi musicali dello stesso tipo devono
; essere mostrati da soli nell'editore sequenza
;this variable states if the same kind musical events must be shown alone in
; the sequence editor
;---------------------
MostraEventiMusicaliDelloStessoTipoDaSoli.b=False

;----------------------------------------------------------------------------
;questa variabile indica se deve essere mostrato il nuovo valore dell'evento
; selezionato mosso con il mouse
;this variable states if the new value of the selected event dragged by mouse
; must be showed or not
;-----------------------
MostraNuovoValore.b=False

;---------------------------------------------------------------------------
;questa variabile sara' maggiore di zero se una nota non e' stata terminata
;this variable will be greater than zero if one or more notes have not been
; terminated
;------------
NoteSuonate.l=0

;--------------------------------------------------------------------
;questa variabile indica l'ottava visualizzata nell'editore sequenza
;this variable states the visualized octave in the sequence editor
;------------------------------------------------------------------
OttavaSelezionata.b=#_MiddleC/12

;-------------------------------------------
;questa variabile indica la sequenza in uso
;this variable states the sequence in use
;-----------------------------------------
Sequenza.l=0

;--------------------------------------------------------------------------
;questa variabile indica la scala di visualizzazione delgi eventi musicali
; dell'editore sequenza
;this variable states the musical events visualization scale of the sequence
; editor
;--------
ScalaEventiMusicali.w=1

;--------------------------------------------------------------------------
;questa variabile indica la sequenza selezionata; se contiene zero nessuna
; sequenza e' selezionata, altrimenti contiene il numero positivo che
; identifica la sequenza
;this variable states the selected sequence; if retains zero no sequence is
; selected, otherwise retain the positive number that identifies the sequence
;-----------------------------------------------------------------------------
SequenzaSelezionata=0

;-----------------------------------------------------------------------------
;questa variabile indica se la lista degli ultimi 5 progetti e' stata scritta
;this flag states if the last 5 loaded projects list has been written
;---------------------------------------------------------------------
StoriaDeiProgettiAperti.b=False

;------------------------------------------------------------------------------
;La nota base, il quarto, corrisponde a 192 tic; questa costante indica quanti
; tic passano in un 50mo di secondo per un tempo di 120 battute per minuto
;The basic note, the quarter, corresponds to 192 ticks; this constant signs
; how many ticks takes passes in a 50th of a second for a time of 120 measures
; per minutes
;-------------
TicPerCinquantesimoDiSecondo.f=30.72

;--------------------------------------------------------------------------
;la seguente variabile stringa indica il tipo di evento musicale corrente;
; all'inizio e' impostata sull'evento nota
;the following string variable states the current musical event; at the
; beginning is set on the note event
;------------------------------------
TipoDiEventoBase$="Note"

;------------------------------------------------------------------------------
;questa variabile indica per le note la velocita' di base e per i controlli il
; valore di base; valore utile da zero a 127
;this variable states for the notes the basic velocity and for the controls
; the basic value; useful value from zero to 127
;------------------------------------------------
ValoreEventoBase.b=64

;-----------------------------------------------------------------------
;questa variabile indica la posizione della voce Quit del menu' Project
;this variable marks the position of voice Quit in the Project menu
;-------------------------------------------------------------------
VoceMenuEsci.b=4

;-------------------------------------------------------------------------
;questa variabile indica la voce dell'AMIGA che non e' attiva; ogni "uno"
; corridponde ad una voce di Amiga
;this variable states the Amiga voice that is not active; each "one" is
; related to an AMIGA voice
;---------------------------
VoceSpenta=%1111

;---------------------------------------------------------------------------
;questa variabile indica la posizione d'inizio per la visualizzazione delle
; tracce
;this variables states the start position for the tracks displaying
;-------------------------------------------------------------------
XTracceVisibili.l=0

;------------------------------------------------------------
;questa variabile memorizza la prima traccia da visualizzare
;this variable stores the first track to be displayed
;-----------------------------------------------------
YTracceVisibili.w=0

;----------------------------------------------------------------------
;queste cinque variabili indicizzate conterranno i nomi degli ultimi 5
; progetti caricati
;this five indexed variables will keep names of last 5 projects loaded
;----------------------------------------------------------------------
Dim ProgettoAperto$(4)

;-----------------------------------------------------------------------------
;questa struttura di variabili e' una tabella di riferimento per il periodo e
; la frequenza associati ad ognuna delle 128 note possibili
;this variables structure is a refferring table for the periode and frequency
; paired to every one of the 128 given notes
;--------------------------------------------
NEWTYPE .PeriFreq

;--------
;periode
;--------
 Periodo.l

;----------
;frequency
;----------
 Frequenza.f
End NEWTYPE
Dim PeriFreq.PeriFreq(127)

;--------------------------------------------------------------------------
;la seguente struttura di variabili serve per identificare il tipo di note
;the following variables structure is used to states the notes kind
;-------------------------------------------------------------------
NEWTYPE .TipoDiNota

;note italian name
 NomeItaliano$

;note english name
 NomeInglese$

;diesis flag
 Diesis.b

;note octave
 Ottava.b
End NEWTYPE
Dim TipoDiNota.TipoDiNota(127)

;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione dei suoni per l'Amiga
;the following variables structure is for Amiga sounds management
;-----------------------------------------------------------------
NEWTYPE .Suono

;---------------------------------------------------
;questa variabile indica il nome del suono caricato
;this variable states the name of the loaded sound
;--------------------------------------------------
 Nome$

;----------------------------------------------------------------------------
;questa variabile indica il canale associato al suono caricato; valore utile
; da 1 a 16, o zero se nessun canale e' associato al suono
;this variable states the channel linked to the loaded sound; useful value
; from 1 to 16, or zero if no channel is assigned to the sound
;--------------------------------------------------------------
 Canale.b

End NEWTYPE
Dim Suono.Suono(31)

NEWTYPE .Sequenza

;--------------------------------------------------
;questa variabile memorizza il nome della sequenza
;this variable stores the sequence name
;---------------------------------------
Nome$

;----------------------------------------------------------
;questa variabile indica l'inizio temporale della sequenza
;this variable states the sequence time start
;---------------------------------------------
Inizio.l

;-----------------------------------------------------------
;questa variabile indica la durata temporale della sequenza
;this variable states the sequence time duration
;------------------------------------------------
Durata.l

;--------------------------------------------------------------------
;questa variabile indica la traccia di appartenenenza della sequenza
;this variable states the track that the sequence is belonging to
;-----------------------------------------------------------------
Traccia.w

;------------------------------------------------------------------
;questa variabile indica gli eventi musicali totali della sequenza
;this variable states the sequence's total musical events
;---------------------------------------------------------
EventiMusicali.l

;-----------------------------------------------------------------------
;questa variabile indica gli eventi musicali selezionati della sequenza
;this variable states the sequence's selected musical events
;------------------------------------------------------------
EventiMusicaliSelezionati.l

End NEWTYPE
Dim List Sequenza.Sequenza(#MassimoSequenze-1)

;------------------------------------------------------------------------
;queste variabili indicizzate indicano True (Vero) se la traccia esiste,
; altrimenti indicano False (Falso)
;these indexed variables (arrays) state True if track exist, otherwise state
; False
;-------
Dim Traccia.b(#MassimoTracce-1)

;----------------------------------------------------------------------------
;la seguente struttura di variabili e' per la gestione degli eventi musicali
;the following vars structure is for the musical events management
;------------------------------------------------------------------
NEWTYPE .EventoMusicale

;----------------------------------------------------------------------------
;questa variabile stringa indica il tipo di evento musicale, che puo' essere
; una nota od un parametro MIDI
;This string variable states the musical event kind, that can be a note or a
; MIDI parameter
;----------------
 Tipo$

;-----------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica l'altezza;
; valore utile da zero a 127
;if the event is a note, this variable states its height; useful value from
;zero to 127
;------------
 Evento.b

;----------------------------------------------------------------------------
;questa variabile indica la posizione dell'evento musicale nel tempo in tic;
; valore utile da zero a 2 miliardi e rotti
;this variable states musical event position in time by ticks; useful value
;from zero to over 2 billions
;-----------------------------
 Inizio.l

;------------------------------------------------------------------------------
;questa varibile indica il canale dell'evento musicale; valore utile da 1 a 16
;this variable states musical event's channel; useful value from 1 to 16
;------------------------------------------------------------------------
 Canale.b

;-----------------------------------------------------------------------------
;questa variabile identifica la sequenza di appartenenza dell'evento musicale
; valore utile da 1 a 32768
;this variable states the sequence witch the musical event belong to: useful
; value from 1 to 32768
;-----------------------
 Sequenza.l

;------------------------------------------------------------------------------
;se l'evento musicale e' una nota, questa variabile ne indica in tic la durata
; nel tempo; valore utile da 0 a 2 miliardi e rotti (192 tic=nota di un quarto)
;if the event is a note, this variable states its duration in time by ticks;
;useful value from zero to over 2 billions (192 ticks=a quarter note)
;---------------------------------------------------------------------
 Durata.l

;--------------------------------------------------------------------------
;se l'evento musicale e'una nota, questa variabile ne indica l'intensita',
;cioe' il suo volume; se invece l'evento e' un controllo ne indica il valore
;if the musical event is a note, this variable states its intensity, that is
; its volume; if instead is a control it states its value
;---------------------------------------------------------
 Valore.b

;----------------------------------------------------------------------------
;questa variabile indica se l'evento musicale e' stato selezionato, tagliato
; copiato, eseguito o terminato, piu' precisamente:
; 0=evento non selezionato
; 1=evento selezionato
; +2=evento tagliato
; +4=evento copiato
; +8=evento eseguito
; +16=evento terminato
;this variable states if the musical event has been selected, cutted, copied
; executed or terminatted, more precisely:
; 0=unselected event
; 1=selected event
; +2=cutted event
; +4=copied event
; +8=executed event
; +16=ended event
;-----------------
 Stato.b

End NEWTYPE

DEFTYPE .EventoMusicale NotaSuonata

;-----------------------------------------------------
;imposta il numero massimo di eventi musicali usabili
;sets the maximun musical events handling
;-----------------------------------------
MassimoEventiMusicali.l=Min((FastFree-65536)/SizeOf .EventoMusicale,32768)

;---------------------------------------------------------------------------
;crea le variabili array lista con la struttura del NEWTYPE .EventoMusicale
;creates the list array variables with the NEWTYPE .EventoMusicale structure
;----------------------------------------------------------------------------
Dim List EventoMusicale.EventoMusicale(MassimoEventiMusicali-1)

;-----------------------------------------------------------------
;questa variabile indica se e' stato attivato un dispositivo MIDI
;this variable states if a MIDI device has been activated
;---------------------------------------------------------
MIDIAttivato.l=0

;------------------------------------------------------------------------------
;questa variabile indica se si entra nell'editore sequenza per la prima volta,
; per mostrare i requester che riportano i tasti utili
;this variable states if you enters in the sequence editor for the first time,
; to show the requesters that show the useful keys
;--------------------------------------------------
PrimaVoltaNellEditoreSequenza.b=True

;--------------------------------------------------------------------------
;questa procedura imposta la fonte di caratteri Topaz8 per schermo, menu e
; requester, ma non per le finestre
;this procedure sets the characters font Topaz8 for screen, menus and
; requester, but not for windows
;--------------------------------
Statement CaricaLaFonteDiCaratteriTopaz8{}
SHARED AltezzaFonte
 AltezzaFonte=8:LoadFont #FonteDiCaratteriTopaz8,"topaz.font",AltezzaFonte
End Statement

;------------------------------------------------------------
;questa procedura imposta il parlato dell'AMIGA se possibile
;this procedure sets the AMIGA speech if it is possible
;-------------------------------------------------------
Statement ImpostaIlParlatoDellAmiga{}
SHARED ParlatoAttivato
 If Exists("LIBS:translator.library") AND Exists("DEVS:narrator.device")
  SetVoice 130,250,0,1,64,22200
  Speak "Speech is enabled!"
  ParlatoAttivato=True
 Else
  Messaggio$="Unable to set speech,|"
  Messaggio$+"required files:|"
  Messaggio$+"LIBS:translator.library|"
  Messaggio$+"DEVS:narrator.device|"
  Messaggio$+"These are supplied with|"
  Messaggio$+"the workbench 1.2|"
  Messaggio$+"Search on Aminet their|"
  Messaggio$+"third part improvement|"
  EZRequest "AmySequencer message",Messaggio$,"OK"
  ParlatoAttivato=False
 EndIf
End Statement

;-----------------------------------------------
;questa procedura carica le immagini delle note
;this procedure loads the note images
;-------------------------------------
Statement CaricaLeImmaginiDelleNote{}
 BitMap 0,126,16,1
 LoadBitMap 0,"Notes.2Cols"
 GetaShape 0,0,0,22,16
 GetaShape 1,23,0,12,16
 GetaShape 2,36,0,12,16
 GetaShape 3,49,0,17,16
 GetaShape 4,67,0,17,16
 GetaShape 5,85,0,17,16
 GetaShape 6,103,0,17,16
 GetaShape 7,121,0,5,16
 Free BitMap 0
End Statement

;----------------------------------------------
;questa procedura attiva la comunicazione MIDI
;this procedure activates the MIDI communication
;------------------------------------------------
Statement AttivaMIDI{}
SHARED MIDIAttivato
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 Repeat
  If MIDIAttivato=True Then CloseSerial 0
  WLocate 0,0:WColour 0,0:Print SPACE$(80)
  WLocate 0,0:WColour 3:Print "Please type your MIDI device name>"
  DispositivoMIDI$=StripLead$(StripTrail$(Edit$("serial.device",35),Asc(" ")),Asc(" "))
  WLocate 0,0:Print SPACE$(80)
  If DispositivoMIDI$<>""
   MIDIAttivato=OpenSerial(DispositivoMIDI$,0,31250,16)
   If MIDIAttivato=0
    EZRequest "AmySequencer message","Unable to open MIDI|on "+DispositivoMIDI$,"OK"
   Else
    SetSerialBuffer 0,64
    MIDIAttivato=True
   EndIf
  EndIf
 Until MIDIAttivato=True
 EZRequest "AmySequencer message","MIDI has been activated|on "+DispositivoMIDI$,"OK"
 WJam #UnColoreConSfondoTrasparente
End Statement

;-------------------------------------------------
;questa procedura cambia la misurazione del tempo
;this procedure change the time misuration
;------------------------------------------
Statement CambiaLaMisuraDelTempo{}
SHARED Battiti
SHARED Misure
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3:Print "Please type the basic time beat>"
 Battiti=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
 Battiti=Min(Max(Battiti,1),16)
 WLocate 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3:Print "Please type the basic time measures>"
 Misure=Val(StripLead$(StripTrail$(Edit$("4",35),Asc(" ")),Asc(" ")))
 Misure=Min(Max(Misure,1),8)
 WJam #UnColoreConSfondoTrasparente
End Statement

;--------------------------------------------------------
;questa procedura mostra gli eventi musicali disponibili
;this procedure shows the available musical events
;--------------------------------------------------
Statement MostraGliEventiMusicaliDisponibili{}
SHARED MassimoEventiMusicali
SHARED Sequenza()
SHARED TotaleEventiMusicali
 Sequenze.w=0
 TotaleEventiMusicali=0
 PushItem Sequenza()
 ResetList Sequenza()
 While NextItem(Sequenza())=True
  If Sequenza()\Durata>0
   TotaleEventiMusicali+Sequenza()\EventiMusicali
   Sequenze+1
  EndIf
 Wend
 PopItem Sequenza()
 WLocate 0,0:WColour 3:Print MassimoEventiMusicali," events allocated, ",TotaleEventiMusicali," event"
 If TotaleEventiMusicali<>1 Then Print "s"
 Print " used, "
 If Sequenze>0
  Print Str$(Sequenze)," sequence":If Sequenze>1 Then Print "s"
 Else
  Print "no sequences"
 EndIf
End Statement

;-------------------------------------------------------------------
;mostra la velocita' di esecuzione delle note in battute per minuto
;shows the execution velocity in measures per minute
;----------------------------------------------------
Statement MostraLeBattutePerMinuto{BattutePerMinuto.w,CanaleEvento.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED XPosSfondoBattutePerMinuto
SHARED YPosSfondoBattutePerMinuto
 TicPerCinquantesimoDiSecondo.f=BattutePerMinuto*192*4/3000
 WJam #DueColoriConSfondoPieno
 If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
  XMessaggio.w=0
  YMessaggio.w=AltezzaInternaFinestraPrincipale-8-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(Len("BPM>000-ticks/50th>000.0"))
  WBlit 8,XPosSfondoBattutePerMinuto,YPosSfondoBattutePerMinuto
  WJam #UnColoreConSfondoTrasparente:WColour 3
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  WColour CanaleEvento-1,16-CanaleEvento
  XMessaggio=16*16+8*3+8*4+8*6
  YMessaggio=AltezzaInternaFinestraEditoreSequenza-8
  Print SPACE$(80-XMessaggio/8)
 EndIf
 WLocate XMessaggio,YMessaggio
 Format "000":Print "BPM>",BattutePerMinuto
 Format "000.0":Print"-ticks/50th>",TicPerCinquantesimoDiSecondo
 Format ""

End Statement

;------------------------------------------------------
;questa procedura mostra il tempo in battiti su misure
;this procedure shows the tempo by beats per measures
;-----------------------------------------------------
Statement MostraIlTempo{Tempo.b,CanaleEvento.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
 WJam #DueColoriConSfondoPieno
 If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
  XMessaggio.w=(80-Len("Tempo00/00"))*8
  YMessaggio.w=AltezzaInternaFinestraPrincipale-8-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(Len("Tempo00/00"))
  WBlit 9,XPosSfondoTempo,YPosSfondoTempo
  WJam #UnColoreConSfondoTrasparente:WColour 3
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  WColour CanaleEvento-1,16-CanaleEvento
  XMessaggio=16*16+8*3+8*4+8*6
  YMessaggio=AltezzaInternaFinestraEditoreSequenza-8
  Print SPACE$(80-XMessaggio/8)
 EndIf
 WLocate XMessaggio,YMessaggio
 Format "00":Print "Tempo",Str$(Tempo MOD 16+1),"/",Str$(Tempo/16+1):Format ""
End Statement

;----------------------------------------------------------------------------
;questa procedura crea una tabella di riconoscimento delle note, memorizzata
; nell'array TipoDiNota()
;this procedure crates a referring note recognition table, stored in the
; TipoDiNota() array (that means Note Kind)
;-------------------------------------------
Statement ImpostaIlTipoDiNota{Nota.b}
SHARED TipoDiNota()

;--------------------------------------------
;questa variabile indica l'ottava della nota
;this variable state the note octave
;------------------------------------
 OttavaDellaNota.b=Nota/12

 TipoDiNota(Nota)\Ottava=OttavaDellaNota

;-----------------------------------------------------------------------
;questa variabile indica a quali delle 12 note dodici note fondamentali
; corrisponde la nota corrente
;this variable marks which of 12 fundamental notes corresponds the current
; note
;------
 NotaNellOttava.b=Nota MOD 12

 Select NotaNellOttava

;------------------
;la nota e' un Do?
;is the given note a C?
;-----------------------
 Case 0
  TipoDiNota(Nota)\NomeItaliano="Do"
  TipoDiNota(Nota)\NomeInglese="C"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Do diesis (Do#)?
;is the given note a C diesis (C#)?
;-----------------------------------
 Case 1
  TipoDiNota(Nota)\NomeItaliano="Do#"
  TipoDiNota(Nota)\NomeInglese="C#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Re?
;is the given note a D?
;-----------------------
 Case 2
  TipoDiNota(Nota)\NomeItaliano="Re"
  TipoDiNota(Nota)\NomeInglese="D"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Re diesis (Re#)?
;is the given note a D diesis (D#)?
;-----------------------------------
 Case 3
  TipoDiNota(Nota)\NomeItaliano="Re#"
  TipoDiNota(Nota)\NomeInglese="D#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Mi?
;is the given note a E?
;-----------------------
 Case 4
  TipoDiNota(Nota)\NomeItaliano="Mi"
  TipoDiNota(Nota)\NomeInglese="E"
  TipoDiNota(Nota)\Diesis=False

;------------------
;la nota e' un Fa?
;is the given note a F?
;-----------------------
 Case 5
  TipoDiNota(Nota)\NomeItaliano="Fa"
  TipoDiNota(Nota)\NomeInglese="F"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un Fa diesis (Fa#)?
;is the given note a F diesis (F#)?
;-----------------------------------
 Case 6
  TipoDiNota(Nota)\NomeItaliano="Fa#"
  TipoDiNota(Nota)\NomeInglese="F#"
  TipoDiNota(Nota)\Diesis=True

;-------------------
;la nota e' un Sol?
;is the given note a G?
;-----------------------
 Case 7
  TipoDiNota(Nota)\NomeItaliano="Sol"
  TipoDiNota(Nota)\NomeInglese="G"
  TipoDiNota(Nota)\Diesis=False

;---------------------------------
;la nota e' un Sol diesis (Sol#)?
;is the given note a G diesis (G#)?
;-----------------------------------
 Case 8
  TipoDiNota(Nota)\NomeItaliano="Sol#"
  TipoDiNota(Nota)\NomeInglese="G#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un La?
;is the given note an A?
;------------------------
 Case 9
  TipoDiNota(Nota)\NomeItaliano="La"
  TipoDiNota(Nota)\NomeInglese="A"
  TipoDiNota(Nota)\Diesis=False

;-------------------------------
;la nota e' un La diesis (La#)?
;is the given note an A diesis (A#)?
;------------------------------------
 Case 10
  TipoDiNota(Nota)\NomeItaliano="La#"
  TipoDiNota(Nota)\NomeInglese="A#"
  TipoDiNota(Nota)\Diesis=True

;------------------
;la nota e' un Si?
;is the given note a B?
;-----------------------
 Case 11
  TipoDiNota(Nota)\NomeItaliano="Si"
  TipoDiNota(Nota)\NomeInglese="B"
  TipoDiNota(Nota)\Diesis=False

 End Select
End Statement

Statement CalcolaLaFrequenzaEdIlPeriodoDelleNote{}
SHARED PeriFreq()
SHARED DistanzaSemitono
;-------------------------------------------------------------------------
;per ottenere la frequenza di tutte le 128 note, si parte dal La della 4a
; ottava (la prima e' l'ottava zero), la cui frequenza e' nota e la si
; moltiplica o divide per la distanza minima tra due note che e' il semitono;
; per ottenere il periodo si divide una delle costanti di temporizzazione, a
; seconda che il il proprio AMIGA usi uno schermo PAL o NTSC, per la frequenza
; della nota; queste costanti sono riportate sul MANUALE DI RIFERIMENTO PER
; L'HARDWARE AMIGA
;to obtain all 128 notes it starts from the A from the 4rd octave (the 1st is
; the zero octave) that has a known frequency, and it multiply or divide this
; for the minimum distance between two notes that is the semitone; to obtain
; the period it divides one of the timing constants, depending on your AMIGA
; uses a PAL or NTSC screen, for the note frequency; these constants are
; reported on the AMIGA HARDWARE REFERENCE MANUAL
;-------------------------------------------------
PeriFreq(45)\Frequenza=440
If NTSC=True
 PeriFreq(45)\Periodo=#TemporizzazioneNTSC/PeriFreq(45)\Frequenza
Else
 PeriFreq(45)\Periodo=#TemporizzazionePAL/PeriFreq(45)\Frequenza
EndIf
ImpostaIlTipoDiNota{45}

For Nota.w=46 To 127
 PeriFreq(Nota)\Frequenza=PeriFreq(Nota-1)\Frequenza*DistanzaSemitono
 If NTSC=True
  PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
 Else
  PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
 EndIf
 ImpostaIlTipoDiNota{Nota}
Next Nota

For Nota=44 To 0 Step -1
 PeriFreq(Nota)\Frequenza=PeriFreq(Nota+1)\Frequenza/DistanzaSemitono
 If NTSC=True
  PeriFreq(Nota)\Periodo=#TemporizzazioneNTSC/PeriFreq(Nota)\Frequenza
 Else
  PeriFreq(Nota)\Periodo=#TemporizzazionePAL/PeriFreq(Nota)\Frequenza
 EndIf
 ImpostaIlTipoDiNota{Nota}
Next Nota
End Statement

;------------------------------------------------------------------------------
;la seguente procedura converte un valore temporale da tic in battute, battiti
; e tic; la variabile OrigineZero serve per la differente visualizzazione
; della durata delle note che, se vera, parte da zero
;the following procedure converts a time value from ticks into bars, beats and
; ticks; the OrigineZero variable is used for the different note length
; displacement that, if this is true, starts from zero instead of starting
; from one
;----------
Statement ConvertiIlTempoInBattute{Tempo.l,Battiti.b,Misure.b,OrigineZero.b}
 If OrigineZero=True
  Battuta.l=Tempo/(192*4.0)/Misure*Battiti
  Battito.b=(Tempo/(192/(Misure/4.0))) MOD Battiti
 Else
  Battuta=Tempo/(192*4.0)/Misure*Battiti+1
  Battito=(Tempo/(192/(Misure/4.0))) MOD Battiti+1
 EndIf
 Print Battuta,".",Battito
 Tic.w=Tempo MOD (192/(Misure/4.0))
 If Tic>0 Then Print ".",Tic
End Statement

;-------------------------------------------------
;questa procedura imposta le barre di scorrimento
;this procedure sets sliders
;----------------------------
Statement ImpostaSlider{Slider.l,XPos.w,YPos.w,Orientamento$,Parametri.l,ListaGadgetSlider.l}
SHARED XLunSlider
SHARED YLunSlider
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL" Then Parametri+#MovimentoOrizzontale
 If Orientamento$="VERTICAL" Then Parametri+#MovimentoVerticale
 PropGadget ListaGadgetSlider,XPos,YPos,Parametri,Slider,XLunSlider,YLunSlider
End Statement

;------------------------------------------------
;questa procedura mostra le barre di scorrimento
;this procedure showss the sliders
;----------------------------------
Statement MostraSlider{Slider.l,ValoreDato.l,ValoreMassimo.l,Orientamento$,ListaGadgetSlider.l,FinestraSlider.l}
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL"
  SetHProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
 EndIf
 If Orientamento$="VERTICAL"
  SetVProp ListaGadgetSlider,Slider,ValoreDato/ValoreMassimo,1/ValoreMassimo
 EndIf
 Redraw FinestraSlider,Slider
End Statement

;--------------------------------------------------
;questa procedura gestisce le barre di scorrimento
;this procedure manage the sliders
;----------------------------------
Function .l ValoreSlider{Slider.l,ValoreMassimo.l,LunghezzaSlider.l,Orientamento$,ListaGadgetSlider.l}
 Orientamento$=UCase$(Orientamento$)
 If Orientamento$="HORIZONTAL"
  ValoreSlider.f=HPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
  ValoreIndicatoDalTopo.w=EMouseX*ValoreMassimo/LunghezzaSlider
 EndIf
 If Orientamento$="VERTICAL"
  ValoreSlider=VPropPot(ListaGadgetSlider,Slider)*ValoreMassimo
  ValoreIndicatoDalTopo=EMouseY*ValoreMassimo/LunghezzaSlider
 EndIf
 ValoreIndicatoDalloSlider.l=Int(ValoreSlider)
 If ValoreIndicatoDalTopo>ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider+1
 If ValoreIndicatoDalTopo<ValoreIndicatoDalloSlider Then ValoreIndicatoDalloSlider-1
 ValoreIndicatoDalloSlider=Min(Max(ValoreIndicatoDalloSlider,0),ValoreMassimo)
 Function Return ValoreIndicatoDalloSlider
End Function

;--------------------------------------------------------------
;questa procedura cancella il file storico dei progetti aperti
;this procedure clears the loaded projects history file
;-------------------------------------------------------
Statement CancellaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
 KillFile "ProjectsHistory"
 VoceMenuEsci=4
 StoriaDeiProgettiAperti=False
 For ProgettoAperto.b=0 To 4
  ProgettoAperto$(ProgettoAperto)=""
 Next ProgettoAperto
End Statement

;------------------------------------------------------------
;questa procedura carica il file storico dei progetti aperti
;this procedure loads the loaded projects history file
;------------------------------------------------------
Statement CaricaLaStoriaDeiProgettiAperti{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
 StoriaDeiProgettiAperti=ReadFile(0,"ProjectsHistory")
 If StoriaDeiProgettiAperti=True
  FileInput 0
  ProgettoAperto=0
  Repeat
   Dato$=Inkey$
   If Dato$=Chr$(10)
    ProgettoAperto+1
    VoceMenuEsci+1
   Else
    ProgettoAperto$(ProgettoAperto)+Dato$
   EndIf
  Until Dato$=""
  CloseFile 0
  PopInput
 EndIf
End Statement

;------------------------------------------------------------------
;crea la bitmap per l'immagine di sfondo della finestra principale
;creates the bitmap for the background pic of the main window
;-------------------------------------------------------------
Statement CreaLaBitmapPerLImmagineDiSfondo{}

;----------------------------------------
;crea la bitmap per l'immagine di sfondo
;creates the bitmap for the background pic
;------------------------------------------
 BitMap #BitmapImmagineDiSfondo,640,240,4

End Statement

;-------------------------------------------------------------------
;carica l'immagine di sfondo della finestra principale nella bitmap
;loads the background pic of the main window into the bitmap
;------------------------------------------------------------
Statement CaricaLImmagineDiSfondoNellaBitmap{}
SHARED ColoriOriginali

If ColoriOriginali=True
 ImmagineDiSfondo$="BackPicOC.16Cols"
Else
 ImmagineDiSfondo$="BackPic.16Cols"
EndIf

;----------------------------------------------------------------------------
;carica l'immagine di sfondo per la finestra principale nella bitmap creata
; per questa
;loads the main window background image into the bitmap creted for it
;---------------------------------------------------------------------
 LoadBitMap #BitmapImmagineDiSfondo,ImmagineDiSfondo$,#TavolozzaDeiColori

;---------------------------------------------------
;usa la tavolozza dei colori dell'immagine caricata
;use loaded image colours palette
;---------------------------------
 Use Palette #TavolozzaDeiColori

End Statement

;------------------------------------
;questa procedura imposta lo schermo
;this procedure sets the screen
;-------------------------------
Statement ImpostaLoSchermo{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED LarghezzaSchermo
SHARED TracceVisibili

;--------------------------------------
;imposta la fonte di caratteri globale
;sets the global characters font
;--------------------------------
 Use IntuiFont #FonteDiCaratteriTopaz8

;------------------------------------
;inizializza la tavolozza dei colori
;initializes the colours palette
;--------------------------------
 InitPalette #TavolozzaDeiColori,16

;-------------------------------
;carica i colori per lo schermo
;loads colours for screen
;-------------------------
; For Colore.b=0 To 15
;  Read Rosso.b
;  Read Verde.b
;  Read Blu.b
;  PalRGB #TavolozzaDeiColori,Colore,Rosso,Verde,Blu
; Next Colore

;----------------------------------------------------------------
;imposta le penne dello schermo con i migliori colori (ROM 2.0+)
;sets screen pens with best colours (ROM 2.0+)
;----------------------------------------------
 ScreenPens 3,2,0,1,3,1,2

;------------------------------------------------
;apre lo schermo in alta risoluzione a 16 colori
;opens high resolution screen with 16 colours
;---------------------------------------------
 Screen #Schermo,4+8,"AmySequencer by Stefano Maria Regattin"

;-----------------------------
;usa la tavolozza dei colori
;use colours palette
;--------------------
 Use Palette #TavolozzaDeiColori

;-------------------------------------------------------------------------------
;questa variabile contiene l'indirizzo di memoria della struttura dello schermo
;this variable retains the screen structure memory address
;----------------------------------------------------------
 IndirizzoSchermo.l=Peek.l(Addr Screen(0))

;----------------------------------------------------------
;questa variabile contiene la vera larghezza Dello schermo
;this variable retains the true screen width
;--------------------------------------------
 LarghezzaSchermo=Peek.w(IndirizzoSchermo+12)

;--------------------------------------------------------
;questa variabile contiene la vera altezza dello schermo
;this variable retains the true screen height
;---------------------------------------------
 AltezzaSchermo=Peek.w(IndirizzoSchermo+14)

;-------------------------------------------------------------
;questa variabile indica il massimo numero di tracce visibili
;this variable states the visible tracks maximum number
;-------------------------------------------------------
 TracceVisibili=(AltezzaSchermo-(AltezzaFonte+3)-8-8-8)/8

End Statement

;-----------------------------------------------------------------------
;questa procedura mostra l'immagine di sfondo nella finestra principale
;this procedure shows the  background pic into the main window
;--------------------------------------------------------------
Statement MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;---------------------------------------------------------
;copia l'immamgine dalla bitmap nella finestra principale
;copies the pic from the bitmap into the main window
;----------------------------------------------------
 BitMaptoWindow #BitmapImmagineDiSfondo,#FinestraPrincipale,0,0,0,0,640,240

End Statement

Statement CopiaLoSfondoSottoAlleBattutePerMinuto{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoBattutePerMinuto
SHARED YPosSfondoBattutePerMinuto
 XPosSfondoBattutePerMinuto=0
 YPosSfondoBattutePerMinuto=AltezzaInternaFinestraPrincipale-8-8
 XLunSfondoBattutePerMinuto.w=Len("BPM>000-ticks/50th>000.0")*8
 YLunSfondoBattutePerMinuto.b=8
 GetaShape 8,XPosSfondoBattutePerMinuto,YPosSfondoBattutePerMinuto,XLunSfondoBattutePerMinuto,YLunSfondoBattutePerMinuto
End Statement

Statement CopiaLoSfondoSottoAlTempo{}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED XPosSfondoTempo
SHARED YPosSfondoTempo
 XPosSfondoTempo=LarghezzaInternaFinestraPrincipale-1-(Len("Tempo>00/00")*8-1)
 YPosSfondoTempo=AltezzaInternaFinestraPrincipale-8-8
 XLunSfondoTempo.b=Len("Tempo>00/00")*8
 YLunSfondoTempo.b=8
 GetaShape 9,XPosSfondoTempo,YPosSfondoTempo,XLunSfondoTempo,YLunSfondoTempo
End Statement

;-------------------------------------------------------------------------------
;Questa procedura imposta la finestra principale invisibile e reimposta il menu
; principale
;this procedure sets the main invisible window and resets the main menu
;-----------------------------------------------------------------------
Statement ImpostaLaFinestraPrincipale{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraPrincipale
SHARED AltezzaSchermo
SHARED BattutePerMinuto
SHARED FineMotivo
SHARED FinestraPrincipaleAperta
SHARED LarghezzaInternaFinestraPrincipale
SHARED LarghezzaSchermo
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED TicPerCinquantesimoDiSecondo
SHARED TracceVisibili
SHARED VoceMenuEsci
SHARED XLunSlider
SHARED YLunSlider

;-----------------------------------------------
;se la finestra era gia' stato aperto la chiude
;if window was opened it close it
;---------------------------------
 If FinestraPrincipaleAperta=True
  BeepScreen #Schermo
  Free GadgetList #ListaGadgetPrincipale
  Free MenuList #ListaMenuPrincipale
  CloseWindow #FinestraPrincipale
 EndIf

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

;-------------------------
;imposta il menu' Project
;sets Project menu
;------------------
 MenuTitle #ListaMenuPrincipale,0,"Project"
 MenuItem #ListaMenuPrincipale,0,0,0,"New"
 MenuItem #ListaMenuPrincipale,0,0,1,"Load"
 MenuItem #ListaMenuPrincipale,0,0,2,"Save"
 MenuItem #ListaMenuPrincipale,0,0,3,"Save as"
 If StoriaDeiProgettiAperti=True
  For ProgettoAperto.b=4 To VoceMenuEsci-1
   MenuItem 0,0,0,ProgettoAperto,ProgettoAperto$(ProgettoAperto-4)
  Next ProgettoAperto
 EndIf
 MenuItem 0,0,0,VoceMenuEsci,"Quit"

;--------------------------
;imposta il menu' Controls
;sets Controls menu
;------------------
 MenuTitle #ListaMenuPrincipale,1,"Controls"
 MenuItem #ListaMenuPrincipale,0,1,0,"Play"
 MenuItem #ListaMenuPrincipale,0,1,1,"Record"

;---------------------------
;imposta il menu' Sequences
;sets Sequences menu
;--------------------
 MenuTitle #ListaMenuPrincipale,2,"Sequence"
 MenuItem #ListaMenuPrincipale,0,2,0,"Edit"
 MenuItem #ListaMenuPrincipale,0,2,1,"Name"

;------------------------
;imposta il menu' Sounds
;sets Sounds menu
;-----------------
 MenuTitle #ListaMenuPrincipale,3,"Sounds"
 MenuItem #ListaMenuPrincipale,0,3,0,"Edit"

;-----------------------
;imposta il menu' Prefs
;sets Prefs menu
;----------------
 MenuTitle #ListaMenuPrincipale,4,"Prefs"
 MenuItem #ListaMenuPrincipale,0,4,0,"Set MIDI device"
 MenuItem #ListaMenuPrincipale,1,4,1,"  Original colours"
 MenuItem #ListaMenuPrincipale,0,4,2,"Clear projects history"

;-------------------------------------------------------------------
;apre la finestra principale per ricavarne la larghezza e l'altezza
;opens main window to obtain its width and height
;-------------------------------------------------
 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#FinestraDiSfondo+#FinestraSenzaBordi+#FinestraAttivata
 Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1

 MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;-------------------------------------------------------------------------
;questa variabile conserva la larghezza interna della finestra principale
;this variable stores the inner witdh of the main window
;--------------------------------------------------------
 LarghezzaInternaFinestraPrincipale.w=InnerWidth

;----------------------------------------------------------------------
;questa variabile conserva l'altezza interna della finestra principale
;this variable stores the inner height of the main window
;---------------------------------------------------------
 AltezzaInternaFinestraPrincipale.w=InnerHeight

 CloseWindow #FinestraPrincipale

;----------------------------------------------------------------------
;imposta la barra di scorrimento che regola la velocita' di esecuzione
;sets the slider that tunes the execution velocity
;_-------------------------------------------------
 XLunSlider=LarghezzaInternaFinestraPrincipale
 YLunSlider=8
 ImpostaSlider{1,0,AltezzaInternaFinestraPrincipale-8,"HORIZONTAL",0,#ListaGadgetPrincipale}

;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
 XLunSlider=16
 YLunSlider=TracceVisibili*8
 ImpostaSlider{2,0,8,"VERTICAL",0,#ListaGadgetPrincipale}

;-----------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare le sequenze
;sets the slider that is used to shows the sequences
;_---------------------------------------------------
 XLunSlider=LarghezzaInternaFinestraPrincipale-16
 YLunSlider=4
 ImpostaSlider{3,16,8+TracceVisibili*8,"HORIZONTAL",0,#ListaGadgetPrincipale}

;------------------------------------------------------------------------------
;apre la finestra principale solo per il menu' come invisibile e ci attacca la
; lista dei gadget principale
;opens main window for menu usage only as invisible and it attaches the main
; gadget list
;-------------
 Window #FinestraPrincipale,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetPrincipale

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuPrincipale

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #UnColoreConSfondoTrasparente

;-----------------------------------------------------------------
;le finestre di richiesta sono assegnate alla finestra principale
;the request windows are assigned to main window
;------------------------------------------------
 EZOutput #FinestraPrincipale

 FinestraPrincipaleAperta=True

End Statement

;--------------------------------------------------------------------------
;questa procedura per ora legge solo il nome di un file e o inserisce nel
; menu principale; dovrebbe caricare un progetto di AmySequencer
;this procedure till now only reads a file name and put it into the main menu
; it should load an AmySequencer project
;----------------------------------------
Statement CaricaUnProgetto{}
SHARED ProgettoAperto$()
SHARED StoriaDeiProgettiAperti
SHARED VoceMenuEsci
 MaxLen P$=160
 MaxLen F$=64
 ProgettoAperto$=FileRequest$("Load AmySequencer project",P$,F$)
 If ProgettoAperto$<>""
  For ProgettoAperto.b=0 To 4
   If ProgettoAperto$=ProgettoAperto$(ProgettoAperto) Then Statement Return
  Next ProgettoAperto
  For ProgettoAperto=3 To 0 Step -1
   ProgettoAperto$(ProgettoAperto+1)=ProgettoAperto$(ProgettoAperto)
  Next ProgettoAperto
  ProgettoAperto$(0)=ProgettoAperto$
  StoriaDeiProgettiAperti=WriteFile(0,"ProjectsHistory")
  If StoriaDeiProgettiAperti=True
   FileOutput 0
   For ProgettoAperto=0 To 4
    If ProgettoAperto$(ProgettoAperto)<>""
     NPrint ProgettoAperto$(ProgettoAperto)
    EndIf
   Next ProgettoAperto
   CloseFile 0
   PopOutput
   VoceMenuEsci+1
  EndIf
 EndIf
End Statement

;-----------------------------------------------------------
;questa procedura imposta i suoni da usare con il programma
;this procedure sets sounds to use with the program
;---------------------------------------------------
Statement EditoreSuoni{}
SHARED AltezzaFonte
SHARED AltezzaSchermo
SHARED CanaliAttivati
SHARED LarghezzaSchermo
SHARED PercorsoSuoni$
SHARED Suono()
SHARED XLunSlider
SHARED YLunSlider

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

 MenuTitle #ListaMenuEditoreSuoni,0,"Sounds"
 MenuItem #ListaMenuEditoreSuoni,0,0,0,"Load"
 MenuItem #ListaMenuEditoreSuoni,0,0,1,"Discard"

 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1
 LarghezzaInternaFinestraEditoreSuoni.w=InnerWidth
 AltezzaInternaFinestraEditoreSuoni.w=InnerHeight
 CloseWindow #FinestraEditoreSuoni

;-------------------------------------------------------------------------------
;imposta la barra di scorrimento che serve per visualizzare i suoni disponibili
;sets the slider that is used to show the available sounds
;----------------------------------------------------------
 XLunSlider=16
 YLunSlider=AltezzaInternaFinestraEditoreSuoni
 ImpostaSlider{#SliderEditoreSuoni,LarghezzaInternaFinestraEditoreSuoni-16,0,"VERTICAL",0,#ListaGadgetEditoreSuoni}

 Window #FinestraEditoreSuoni,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"Sounds Editor",-1,-1,#ListaGadgetEditoreSuoni

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuEditoreSuoni

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #DueColoriConSfondoPieno

;-----------------------------------
;sounds window's displacement start
;-----------------------------------
 InizioSuoni.b=0

;------------------------
;maximum strings length
;------------------------
 LunghezzaMassimaStringhe.b=(LarghezzaInternaFinestraEditoreSuoni-16)/8

;---------------------------------
;stated by mouse new sound number
;---------------------------------
 NuovoSuonoIndicatoDalTopo.b=-1

;-----------------------------
;stated by mouse sound number
;-----------------------------
 SuonoIndicatoDalTopo.b=-1

;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
 MostraSlider{#SliderEditoreSuoni,InizioSuoni,2,"VERTICAL",#ListaGadgetEditoreSuoni,#FinestraEditoreSuoni}

 Repeat
  If SecondoClicDelTopo.b=False

   WCls

   WLocate 0,0

;----------------------
;loaded sounds counter
;----------------------
   SuoniCaricati=0

   For Suono.b=0 To 30
    AssegnamentoSuono$=Suono(InizioSuoni+Suono)\Nome
    If AssegnamentoSuono$<>""
     CanaleSuono.b=Suono(InizioSuoni+Suono)\Canale
     If CanaleSuono>0
      WColour CanaleSuono-1,16-CanaleSuono:Format "00":CanaleSuono$=" channel "+Str$(CanaleSuono):Format""
     Else
      WColour 1,0:CanaleSuono$=" no channel"
     EndIf
     AssegnamentoSuono$+CanaleSuono$
     AssegnamentoSuono$=Right$(AssegnamentoSuono$,LunghezzaMassimaStringhe)
     AssegnamentoSuono$+SPACE$(LunghezzaMassimaStringhe-Len(AssegnamentoSuono$))
     NPrint AssegnamentoSuono$
     If SuonoIndicatoDalTopo>-1 AND SuonoIndicatoDalTopo=InizioSuoni+Suono
      If CanaleSuono>0
       Wline 0,SuonoIndicatoDalTopo*8,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8+7,CanaleSuono-1
       Wline 0,SuonoIndicatoDalTopo*8+7,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8,CanaleSuono-1
      Else
       Wline 0,SuonoIndicatoDalTopo*8,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8+7,1
       Wline 0,SuonoIndicatoDalTopo*8+7,LarghezzaInternaFinestraEditoreSuoni-16,SuonoIndicatoDalTopo*8,1
      EndIf
     EndIf
     SuoniCaricati+1
    EndIf
   Next Suono
   SecondoClicDelTopo=True
  EndIf

  If SuoniCaricati=32
   Enable #ListaGadgetEditoreSuoni,#SliderEditoreSuoni
  Else
   Disable #ListaGadgetEditoreSuoni,#SliderEditoreSuoni
  EndIf
  Redraw #FinestraEditoreSuoni
                                                                                                                              
  EventoFinestraEditoreSuoni.l=WaitEvent

  Select EventoFinestraEditoreSuoni
  Case #HaiPremutoUnTastoDelTopo
   TastoDelTopoCliccato.b=MButtons:YTopo=WMouseY
   Select TastoDelTopoCliccato
   Case #TastoSinistroDelTopoPremuto
    NuovoSuonoIndicatoDalTopo=YTopo/8+InizioSuoni
    If NuovoSuonoIndicatoDalTopo=SuonoIndicatoDalTopo
     If SuoniCaricati>0 AND SuonoIndicatoDalTopo<SuoniCaricati
      CanaleSuonoIndicatoDalTopo.b=Suono(SuonoIndicatoDalTopo)\Canale
      If CanaliAttivati=%1111111111111111
       Suono(SuonoIndicatoDalTopo)\Canale=0
       CanaliAttivati BitClr (CanaleSuonoIndicatoDalTopo-1)
      Else
       If CanaleSuonoIndicatoDalTopo>0
        If CanaleSuonoIndicatoDalTopo=16
         Suono(SuonoIndicatoDalTopo)\Canale=0
         CanaliAttivati BitClr 15
         CanaleSuono=0
        Else
         For CanaleSuono=1 To 15
          CanaleLibero.b=CanaleSuono+CanaleSuonoIndicatoDalTopo
          While CanaleLibero>16
           CanaleLibero-16
          Wend
          If CanaliAttivati BitTst (CanaleLibero-1)=False
           Suono(SuonoIndicatoDalTopo)\Canale=CanaleLibero
           CanaliAttivati BitClr (CanaleSuonoIndicatoDalTopo-1)
           CanaliAttivati BitSet (CanaleLibero-1)
           Pop If:Pop For:Pop If:Pop If:Pop If:Goto FineCicloAssegnamentoCanali
          EndIf
         Next CanaleSuono
        EndIf
       Else
        For CanaleSuono=0 To 15
         If CanaliAttivati BitTst CanaleSuono=False
          Suono(SuonoIndicatoDalTopo)\Canale=CanaleSuono+1
          CanaliAttivati BitSet CanaleSuono
          Pop If:Pop For:Pop If:Pop If:Goto FineCicloAssegnamentoCanali
         EndIf
        Next CanaleSuono
       EndIf
      EndIf
FineCicloAssegnamentoCanali
      If CanaleSuono=16 Then EZRequest "AmySequencer Message","No free channel available","OK"
     EndIf
    Else
     SuonoIndicatoDalTopo=NuovoSuonoIndicatoDalTopo
    EndIf
    SecondoClicDelTopo=False
   Case #TastoSinistroDelTopoRilasciato
    SecondoClicDelTopo=True
   End Select
;  Case #HaiPremutoUnGadget
;   InizioSuoni=ValoreSlider{#SliderEditoreSuoni,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
;   SecondoClicDelTopo=False
  Case #HaiRilasciatoUnGadget
   InizioSuoni=ValoreSlider{#SliderEditoreSuoni,2,AltezzaInternaFinestraEditoreSuoni,"VERTICAL",#ListaGadgetEditoreSuoni}
   SecondoClicDelTopo=False
  Case #HaiAttivatoIlMenu
   If MenuHit=0 AND ItemHit=0
    If SuoniCaricati<32
     MaxLen PercorsoSuoni$=160
     MaxLen NomeSuono$=64
     NomeSuono$=FileRequest$("Load a sound...",PercorsoSuoni$,NomeSuono$)
     If NomeSuono$<>""
      StessoSuono.b=False
      If SuoniCaricati>0
       For SuonoPrecedente=0 To SuoniCaricati-1
        If NomeSuono$=Suono(SuonoPrecedente)\Nome Then StessoSuono=True
       Next SuonoPrecedente
      EndIf
      If StessoSuono=False
       Suono=SuoniCaricati
       LoadSound Suono,NomeSuono$
       Suono(Suono)\Nome=NomeSuono$
       Sound Suono,3
      EndIf
     EndIf
    Else
     EZRequest "AmySequencer message","You cannot load more sounds","OK"
    EndIf
   EndIf
   If MenuHit=0 AND ItemHit=1
    If SuoniCaricati>0
     If SuonoIndicatoDalTopo<SuoniCaricati AND SuonoIndicatoDalTopo>-1
      Suono=SuonoIndicatoDalTopo
      Free Sound Suono
      Suono(Suono)\Nome=""
      While Suono+1<SuoniCaricati
       Suono(Suono)\Nome=Suono(Suono+1)\Nome
       Suono(Suono)\Canale=Suono(Suono+1)\Canale
       Suono+1
      Wend
      Suono(Suono)\Nome=""
      CanaliAttivati BitClr (Suono(Suono)\Canale-1)
      Suono(Suono)\Canale=0
      SuonoIndicatoDalTopo=-1
     Else
      EZRequest "AmySequencer message","You must select a sound first","OK"
     EndIf
    Else
     EZRequest "AmySequencer message","You must load a sound first","OK"
    EndIf
   EndIf
   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
;   SuoniAssegnatiAlloStessoCanale.b=False
;   For SuonoUno.b=0 To 31
;    For SuonoDue.b=0 To 31
;     If SuonoUno<>SuonoDue
;      If Suono(SuonoUno)\Canale>0 AND Suono(SuonoUno)\Canale=Suono(SuonoDue)\Canale
;       SuoniAssegnatiAlloStessoCanale=True
;      EndIf
;     EndIf
;    Next SuonoDue
;   Next SuonoUno
;   If SuoniAssegnatiAlloStessoCanale=True
;    Messaggio$="You have two or more sounds|assigned to the same channel;|please adjust all better!"
;    EZRequest "AmySequencer message",Messaggio$,"OK"
;    SecondoClicDelTopo=False
;   Else
   EsciDallEditoreSuoni.b=True
;   EndIf
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoEsc$
    EsciDallEditoreSuoni=True
   Case TastoCursoreSu$
   Case TastoCursoreGiu$
   End Select
   SecondoClicDelTopo=False
  End Select
 Until EsciDallEditoreSuoni=True
 CloseWindow #FinestraEditoreSuoni
 Use Window #FinestraPrincipale
 WJam #UnColoreConSfondoTrasparente
End Statement

;-----------------------------------------------------
;questa procedura cancella a video un evento musicale
;this procedure clears on screen a musical event
;------------------------------------------------
Statement CancellaUnEventoMusicale{TipoDiEventoMusicale$,Evento.w,InizioEvento.l,DurataEvento.l,StatoEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 SelezioneEventoMusicale.b=StatoEvento & #EventoMusicaleSelezionato
 EventoMusicaleTagliato.b=StatoEvento & #EventoMusicaleTagliato
 EventoMusicaleCopiato.b=StatoEvento & #EventoMusicaleCopiato
 Select TipoDiEventoMusicale$
 Case "Note"
  NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
  If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
   InizioNota.l=InizioEvento:FineNota.l=InizioNota+DurataEvento-1
   I.w=16+(InizioNota-XInizioAreaVisibile)/ScalaEventiMusicali
   F.w=16+(FineNota-XInizioAreaVisibile)/ScalaEventiMusicali
   If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
    InizioNotaVisibile.b=True
   Else
    InizioNotaVisibile=False
   EndIf
   If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
    FineNotaVisibile.b=True
   Else
    FineNotaVisibile=False
   EndIf
   If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
    NotaVisibile.b=True
   Else
    If InizioNotaVisibile=True OR FineNotaVisibile=True
     NotaVisibile=True
    Else
     NotaVisibile=False
    EndIf
   EndIf
   If NotaVisibile=True
    X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    If TipoDiNota(Nota)\Diesis=True
     WBox X0Nota,Y0Nota,X1Nota,Y1Nota,0
    Else
     WBox X0Nota,Y0Nota,X1Nota,Y1Nota,3
    EndIf
   EndIf
  EndIf
 Case "Program"
  FineProgramma.l=InizioEvento+Len("Program000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineProgramma+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineProgramma+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineProgramma+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineProgramma-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Programma.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   For Linea.b=0 To 7
    Y=Programma+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineProgramma,Y,0
    Else
     Wline I,Y,FineProgramma,Y,3
    EndIf
   Next Linea
  EndIf
 Case "Control"
  FineControllo.l=InizioEvento+Len("Control000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineControllo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineControllo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineControllo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineControllo-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Controllo.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   For Linea.b=0 To 7
    Y=Controllo+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineControllo,Y,0
    Else
     Wline I,Y,FineControllo,Y,3
    EndIf
   Next Linea
  EndIf
 Case "PolyAftertouch"
  FinePressioneMultipla.l=InizioEvento+Len("Poly000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneMultipla+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneMultipla+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneMultipla+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FinePressioneMultipla-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   PressioneMultipla.b=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   For Linea.b=0 To 7
    Y=PressioneMultipla+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FinePressioneMultipla,Y,0
    Else
     Wline I,Y,FinePressioneMultipla,Y,3
    EndIf
   Next Linea
  EndIf
 Case "MonoAftertouch"
  FinePressioneSingola.l=InizioEvento+Len("Mono000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneSingola+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneSingola+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneSingola+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FinePressioneSingola-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   PressioneSingola.b=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   For Linea.b=0 To 7
    Y=PressioneSingola+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FinePressioneSingola,Y,0
    Else
     Wline I,Y,FinePressioneSingola,Y,3
    EndIf
   Next Linea
  EndIf
 Case "PitchBend"
  FineCurvaDiPicco.l=InizioEvento+Len("Bend+0000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineCurvaDiPicco+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineCurvaDiPicco+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineCurvaDiPicco+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineCurvaDiPicco-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   CurvaDiPicco.b=AreaVisibileDeiValori*Max((127-Evento/128+1),0)/127
   For Linea.b=0 To 7
    Y=CurvaDiPicco+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineCurvaDiPicco,Y,0
    Else
     Wline I,Y,FineCurvaDiPicco,Y,3
    EndIf
   Next Linea
  EndIf
 Case "Tempo"
  FineTempo.l=InizioEvento+Len("Tempo00/00")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineTempo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineTempo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineTempo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineTempo-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   Tempo.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   For Linea.b=0 To 7
    Y=Tempo+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineTempo,Y,0
    Else
     Wline I,Y,FineTempo,Y,3
    EndIf
   Next Linea
  EndIf
 Case "BPM"
  FineBattutePerMinuto.l=InizioEvento+Len("BPM000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineBattutePerMinuto+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineBattutePerMinuto+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineBattutePerMinuto+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+(FineBattutePerMinuto-XInizioAreaVisibile)/ScalaEventiMusicali
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   I=Max(I,16):F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)
   BattutePerMinuto.w=AreaVisibileDeiValori*Max(97-Evento/3+1,0)/97
   For Linea.b=0 To 7
    Y=BattutePerMinuto+Linea
    If TipoDiNota(127-YInizioAreaVisibile-Y/8)\Diesis=True
     Wline I,Y,FineBattutePerMinuto,Y,0
    Else
     Wline I,Y,FineBattutePerMinuto,Y,3
    EndIf
   Next Linea
  EndIf
 End Select
End Statement

;--------------------------------------------
;questa procedura disegna un evento musicale
;this procedure draws a musical events
;--------------------------------------
Statement DisegnaUnEventoMusicale{TipoDiEvento$,Evento.w,InizioEvento.l,DurataEvento.l,CanaleEvento.b,StatoEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 SelezioneEventoMusicale.b=StatoEvento & #EventoMusicaleSelezionato
 EventoMusicaleTagliato.b=StatoEvento & #EventoMusicaleTagliato
 EventoMusicaleCopiato.b=StatoEvento & #EventoMusicaleCopiato
 EventoMusicaleSuonato.b=StatoEvento & #EventoMusicaleSuonato
 Select TipoDiEvento$
 Case "Note"
  NotaVisualizzata.w=(127-Evento-YInizioAreaVisibile)*8
  If NotaVisualizzata>=0 AND NotaVisualizzata+7<=AltezzaInternaFinestraEditoreSequenza-8-8
   FineNota.l=InizioEvento+DurataEvento-1
   I.w=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
   F.w=16+(FineNota-XInizioAreaVisibile)/ScalaEventiMusicali
   If I>=16 AND I<LarghezzaInternaFinestraEditoreSequenza
    InizioNotaVisibile.b=True
   Else
    InizioNotaVisibile=False
   EndIf
   If F>=16 AND F<LarghezzaInternaFinestraEditoreSequenza
    FineNotaVisibile.b=True
   Else
    FineNotaVisibile=False
   EndIf
   If I<16 AND F>LarghezzaInternaFinestraEditoreSequenza
    NotaVisibile.b=True
   Else
    If InizioNotaVisibile=True OR FineNotaVisibile=True
     NotaVisibile=True
    Else
     NotaVisibile=False
    EndIf
   EndIf
   If NotaVisibile=True
    X0Nota=Min(Max(I,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y0Nota=Min(Max(NotaVisualizzata,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    X1Nota=Min(Max(F,16),LarghezzaInternaFinestraEditoreSequenza-1)
    Y1Nota=Min(Max(NotaVisualizzata+7,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    WBox X0Nota,Y0Nota,X1Nota,Y1Nota,16-CanaleEvento
    If EventoMusicaleSuonato=0
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      Wline X0Nota,NotaVisualizzata,X1Nota,NotaVisualizzata+7,CanaleEvento-1
      Wline X0Nota,NotaVisualizzata+7,X1Nota,NotaVisualizzata,CanaleEvento-1
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleNonSelezionato
      Wline X0Nota+1,NotaVisualizzata+1,X1Nota-1,NotaVisualizzata+1,CanaleEvento-1
      Wline X0Nota+1,NotaVisualizzata+6,X1Nota-1,NotaVisualizzata+6,CanaleEvento-1
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleNonSelezionato
      If InizioNotaVisibile=True
       Wline I+1,NotaVisualizzata+1,I+1,NotaVisualizzata+6,CanaleEvento-1
      EndIf
      If FineNotaVisibile=True
       Wline F-1,NotaVisualizzata+1,F-1,NotaVisualizzata+6,CanaleEvento-1
      EndIf
     EndIf
     If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Print Left$("Cutted",(F-I+1)/8)
     If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print Left$("Copied",(F-I+1)/8)
    EndIf
   EndIf
  EndIf
 Case "Program"
  FineProgramma.l=InizioEvento+Len("Program000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineProgramma+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineProgramma+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineProgramma+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineProgramma-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":Programma$="Program"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Programma$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Programma$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print Programma$+"Co"
   If I<0 Then IniziaPrima.b=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo.b=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y.w=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   If IniziaPrima=True Then Programma$=Right$(Programma$,(F-I+1)/8)
   If FinisceDopo=True Then Programma$=Left$(Programma$,(F-I+1)/8)
   WLocate 16+I,Y:Print Programma$
  EndIf
 Case "Control"
  FineControllo.l=InizioEvento+Len("Control000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineControllo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineControllo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineControllo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineControllo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":Controllo$="Control"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Controllo$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Controllo$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print Controllo$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   If IniziaPrima=True Then Controllo$=Right$(Controllo$,(F-I+1)/8)
   If FinisceDopo=True Then Controllo$=Left$(Controllo$,(F-I+1)/8)
   WLocate 16+I,Y:Print Controllo$
  EndIf
 Case "PolyAftertouch"
  FinePressioneMultipla.l=InizioEvento+Len("Poly000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneMultipla+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneMultipla+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneMultipla+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FinePressioneMultipla-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":PressioneMultipla$="Poly"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then PressioneMultipla$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then PressioneMultipla$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print PressioneMultipla$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   If IniziaPrima=True Then PressioneMultipla$=Right$(PressioneMultipla$,(F-I+1)/8)
   If FinisceDopo=True Then PressioneMultipla$=Left$(PressioneMultipla$,(F-I+1)/8)
   WLocate 16+I,Y:Print PressioneMultipla$
  EndIf
 Case "MonoAftertouch"
  FinePressioneSingola.l=InizioEvento+Len("Mono000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FinePressioneSingola+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FinePressioneSingola+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FinePressioneSingola+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FinePressioneSingola-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":PressioneSingola$="Mono"+Str$(Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then PressioneSingola$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then PressioneSingola$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Print PressioneSingola$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   If IniziaPrima=True Then PressioneSingola$=Right$(PressioneSingola$,(F-I+1)/8)
   If FinisceDopo=True Then PressioneSingola$=Left$(PressioneSingola$,(F-I+1)/8)
   WLocate 16+I,Y:Print PressioneSingola$
  EndIf
 Case "PitchBend"
  FineCurvaDiPicco.l=InizioEvento+Len("Bend+0000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineCurvaDiPicco+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineCurvaDiPicco+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineCurvaDiPicco+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineCurvaDiPicco-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "+0000":CurvaDiPicco$="Bend"+Str$(Evento-#_PitchBendCenter):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then CurvaDiPicco$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then CurvaDiPicco$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then CurvaDiPicco$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   If IniziaPrima=True Then CurvaDiPicco$=Right$(CurvaDiPicco$,(F-I+1)/8)
   If FinisceDopo=True Then CurvaDiPicco$=Left$(CurvaDiPicco$,(F-I+1)/8)
   WLocate 16+I,Y:Print CurvaDiPicco$
  EndIf
 Case "Tempo"
  FineTempo.l=InizioEvento+Len("Tempo00/00")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineTempo+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineTempo+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineTempo+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineTempo-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "00":Tempo$="Tempo"+Str$(Evento MOD 16+1)+"/"+Str$(Evento/16+1):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then Tempo$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then Tempo$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then Tempo$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=AreaVisibileDeiValori*Max(127-Evento+1,0)/127
   If IniziaPrima=True Then Tempo$=Right$(Tempo$,(F-I+1)/8)
   If FinisceDopo=True Then Tempo$=Left$(Tempo$,(F-I+1)/8)
   WLocate 16+I,Y:Print Tempo$
  EndIf
 Case "BPM"
  FineBattutePerMinuto.l=InizioEvento+Len("BPM000")*8-1
  If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then FineBattutePerMinuto+Len("X")*8
  If EventoMusicaleTagliato=#EventoMusicaleTagliato Then FineBattutePerMinuto+Len("Cu")*8
  If EventoMusicaleCopiato=#EventoMusicaleCopiato Then FineBattutePerMinuto+Len("Co")*8
  I=16+(InizioEvento-XInizioAreaVisibile)/ScalaEventiMusicali
  F=16+FineBattutePerMinuto-XInizioAreaVisibile
  If I>=16 OR I<LarghezzaInternaFinestraEditoreSequenza OR F>=16 OR F<LarghezzaInternaFinestraEditoreSequenza
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    WColour 3,16-CanaleEvento
   Else
    WColour CanaleEvento-1,16-CanaleEvento
   EndIf
   Format "000":BattutePerMinuto$="BPM"+Str$(9+Evento):Format ""
   If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then BattutePerMinuto$+"X"
   If EventoMusicaleTagliato=#EventoMusicaleTagliato Then BattutePerMinuto$+"Cu"
   If EventoMusicaleCopiato=#EventoMusicaleCopiato Then BattutePerMinuto$+"Co"
   If I<0 Then IniziaPrima=True
   If F>LarghezzaInternaFinestraEditoreSequenza-1 Then FinisceDopo=True
   I=Max(I,16)-16:F=Min(F,LarghezzaInternaFinestraEditoreSequenza-1)-16
   Y=AreaVisibileDeiValori*Max(97-Evento/3+1,0)/97
   If IniziaPrima=True Then BattutePerMinuto$=Right$(BattutePerMinuto$,(F-I+1)/8)
   If FinisceDopo=True Then BattutePerMinuto$=Left$(BattutePerMinuto$,(F-I+1)/8)
   WLocate 16+I,Y:Print BattutePerMinuto$
  EndIf
 End Select
End Statement

;-----------------------------------------------------------
;questa procedura disegna le note di sfondo con i loro nomi
;this procedure draws the notes background with note names
;----------------------------------------------------------
Statement MostraLeNoteDiSfondoConILoroNomi{}
SHARED AreaInvisibileDelleNote
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED TipoDiNota()
SHARED YInizioAreaVisibile
 For Tasto.b=0 To 127-AreaInvisibileDelleNote
  Nota.b=127-Tasto-YInizioAreaVisibile
  Y0Nota.w=Tasto*8:Y1Nota.w=Y0Nota+7
  If TipoDiNota(Nota)\Diesis=True
   WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,0
   WColour 3,0
  Else
   WBox 16,Y0Nota,LarghezzaInternaFinestraEditoreSequenza,Y1Nota,3
   WColour 0,3
  EndIf
  WLocate 16,Y0Nota
  Print "Note ",Nota,">"
  Print TipoDiNota(Nota)\NomeInglese
  Print "-"
  Print TipoDiNota(Nota)\NomeItaliano
  Print TipoDiNota(Nota)\Ottava
 Next Tasto
End Statement

;-----------------------------------------------
;questa procedura mostra i numeri delle battute
;this procedure shows the bar numbers
;-------------------------------------
Statement MostraLeBattute{}
SHARED AreaInvisibileDelleNote
SHARED Battiti
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 Nota.b=127-YInizioAreaVisibile-(127-AreaInvisibileDelleNote)
 Nota$=Str$(Nota):OttavaNota$=Str$(TipoDiNota(Nota)\Ottava):NomeIngleseNota$=TipoDiNota(Nota)\NomeInglese
 NomeItalianoNota$=TipoDiNota(Nota)\NomeItaliano
 LarghezzaTesto.w=Len("Note "+Nota$+">"+NomeIngleseNota$+"-"+NomeItalianoNota$+OttavaNota$+" ")*8
 FineTempo.l=XInizioAreaVisibile+(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
 If TipoDiNota(Nota)\Diesis=True Then WColour 3,0 Else WColour 0,3
 Battito.b=1
 Misura.b=1
 Tempo.l=0
 Repeat
  PushItem EventoMusicale()
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=SequenzaSelezionata AND EventoMusicale()\Inizio<=Tempo
    EventoMusicaleSuonato.b=EventoMusicale()\Stato & #EventoMusicaleSuonato
    If EventoMusicale()\Tipo="Tempo" AND EventoMusicaleSuonato=0
     NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
     NuoveMisure.b=EventoMusicale()\Evento/16+1
     If Battito>1
      Battito=1
      Misura+1
     EndIf
     TempoCambiato=True
     EventoMusicale()\Stato | #EventoMusicaleSuonato
    EndIf
   EndIf
  Wend
  PopItem EventoMusicale()
  XTempo.w=16+(Tempo-XInizioAreaVisibile)/ScalaEventiMusicali
  If XTempo>16+LarghezzaTesto-1
   WLocate XTempo,(127-AreaInvisibileDelleNote)*8
   Print Misura,".",Battito
   If TempoCambiato=True
    Tic.w=Tempo MOD (192/(NuoveMisure/4.0))
   Else
    Tic=Tempo MOD (192/(Misure/4.0))
   EndIf
   If Tic>0 Then Print ".",Tic
  EndIf
  Battute.b=Max(ScalaEventiMusicali/4,1)
  If TempoCambiato=True
   IncrementoTempo.w=(192*(4.0/NuoveMisure))*Battute
  Else
   IncrementoTempo=(192*(4.0/Misure))*Battute
  EndIf
  Battito+Battute
  Tempo+IncrementoTempo
  If TempoCambiato=True
   If Battito>NuoviBattiti Then Battito=1:Misura+1
  Else
   If Battito>Battiti Then Battito=1:Misura+1
  EndIf
 Until Tempo>FineTempo
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  If EventoMusicale()\Tipo="Tempo"
   EventoMusicaleSuonato=EventoMusicale()\Stato & #EventoMusicaleSuonato
   If EventoMusicaleSuonato=#EventoMusicaleSuonato
    EventoMusicale()\Stato & %11110111
   EndIf
  EndIf
 Wend
End Statement

;--------------------------------------------
;questa procedura mostra gli eventi musicali
;this procedure shows musical events
;------------------------------------
Statement MostraGliEventiMusicali{}
SHARED EventoMusicale()
SHARED MostraEventiMusicaliDelloStessoTipoDaSoli
SHARED SequenzaSelezionata
SHARED TipoDiEventoBase$
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  If EventoMusicale()\Sequenza=SequenzaSelezionata
   TipoDiEventoMusicale$=EventoMusicale()\Tipo
   If TipoDiEventoMusicale$=TipoDiEventoBase$ OR MostraEventiMusicaliDelloStessoTipoDaSoli=False
    InizioEvento.l=EventoMusicale()\Inizio
    CanaleEvento.b=EventoMusicale()\Canale
    StatoEvento.b=EventoMusicale()\Stato
    Select TipoDiEventoMusicale$
    Case "Note"
     Nota.b=EventoMusicale()\Evento:DurataNota.l=EventoMusicale()\Durata
     DisegnaUnEventoMusicale{"Note",Nota,InizioEvento,DurataNota,CanaleEvento,StatoEvento}
    Case "Program"
     Programma.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Program",Programma,InizioEvento,0,CanaleEvento,StatoEvento}
    Case "Control"
     Controllo.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Control",Controllo,InizioEvento,0,CanaleEvento,StatoEvento}
    Case "PolyAftertouch"
     PressioneMultipla.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"PolyAftertouch",PressioneMultipla,InizioEvento,0,CanaleEvento,StatoEvento}
    Case "MonoAftertouch"
     PressioneSingola.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"MonoAftertouch",PressioneSingola,InizioEvento,0,CanaleEvento,StatoEvento}
    Case "PitchBend"
     CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
     DisegnaUnEventoMusicale{"PitchBend",CurvaDiPicco,InizioEvento,0,CanaleEvento,StatoEvento}
    Case "Tempo"
     Tempo.b=EventoMusicale()\Evento
     DisegnaUnEventoMusicale{"Tempo",Tempo,InizioEvento,0,CanaleEvento,StatoEvento}
    Case "BPM"
     BattutePerMinuto.w=EventoMusicale()\Evento*3+EventoMusicale()\Valore
     DisegnaUnEventoMusicale{"BPM",BattutePerMinuto,InizioEvento,0,CanaleEvento,StatoEvento}
    End Select
   EndIf
  EndIf
 Wend
End Statement

Statement MostraIlPuntoDiInserimento{}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED CanaleSelezionato
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED PuntoDiInserimento
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
 I.w=16+(PuntoDiInserimento-XInizioAreaVisibile)/ScalaEventiMusicali
 If I>=16 AND I+7<LarghezzaInternaFinestraEditoreSequenza
  If CanaleSelezionato>0
   ColoreTestoPuntoDiInserimento=CanaleSelezionato-1
   ColoreSfondoPuntoDiInserimento=16-CanaleSelezionato
  Else
   ColoreTestoPuntoDiInserimento=3
  EndIf
  WBox I,0,I+7,AltezzaInternaFinestraEditoreSequenza-8-8,ColoreSfondoPuntoDiInserimento
  TestoPuntoDiInserimento$="Insertion point>"
  For TestoPuntoDiInserimento.b=0 To 15
   WLocate I,TestoPuntoDiInserimento*8
   WColour ColoreTestoPuntoDiInserimento,ColoreSfondoPuntoDiInserimento
   Print Mid$(TestoPuntoDiInserimento$,TestoPuntoDiInserimento+1,1)
  Next TestoPuntoDiInserimento
 EndIf
End Statement

;-----------------------------------------------------
;questa procedura mostra gli slider dell'editore note
;this procedure shows the notes editor' sliders
;-----------------------------------------------
Statement MostraSliderEditoreSequenza{}
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED DurataSequenza
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 MostraSlider{1,YInizioAreaVisibile,AreaInvisibileDelleNote,"VERTICAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
 If AreaInvisibileDelTempo=0
  Disable #ListaGadgetEditoreSequenza,2
  XInizioAreaVisibile=0
 Else
  Enable #ListaGadgetEditoreSequenza,2
 EndIf
 MostraSlider{2,XInizioAreaVisibile,AreaInvisibileDelTempo,"HORIZONTAL",#ListaGadgetEditoreSequenza,#FinestraEditoreSequenza}
End Statement

;---------------------------------------------------------------
;questa procedura mostra la scala di visualizzazione delle note
;this procedure shows the note scale of notes displaying
;--------------------------------------------------------
Statement MostraLaScalaDegliEventiMusicali{Ritardo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED ColoriOriginali
SHARED ScalaEventiMusicali
; For Scatola.b=0 To 4
;  Y0Scatola.w=AltezzaInternaFinestraEditoreSequenza-8-8
;  WBox Scatola,Y0Scatola+Scatola,15-Scatola,Y0Scatola+7-Scatola,15-Scatola
; Next Scatola
 Select ScalaEventiMusicali
 Case 1
  Ingrandimento.b=1
 Case 2
  Ingrandimento=2
 Case 4
  Ingrandimento=3
 Case 8
  Ingrandimento=4
 Case 16
  Ingrandimento=5
 Case 32
  Ingrandimento=6
 Case 64
  Ingrandimento=7
 End Select
 WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
 If ColoriOriginali=True Then WColour 1,0 Else WColour 2,1
 Print "Z",Ingrandimento
 If Ritardo=True Then Delay_ 50
 WLocate 0,AltezzaInternaFinestraEditoreSequenza-8-8
 Print "+-"
End Statement

Statement MostraITastiDaUsare{}
 MostraITastiDaUsare$="Esc>.........leave the editor|"
 MostraITastiDaUsare$+"Space>.......insert a rest|"
 MostraITastiDaUsare$+"|"
 MostraITastiDaUsare$+"No selected events:|"
 MostraITastiDaUsare$+"Cursor up>...scroll window up|"
 MostraITastiDaUsare$+"Cursor down>.scroll window down|"
 MostraITastiDaUsare$+"Cursor left>.scroll window backward|"
 MostraITastiDaUsare$+"Cursor right>scroll window forward|"
 MostraITastiDaUsare$+"Backspace>...delete last event|"
 MostraITastiDaUsare$+"|"
 MostraITastiDaUsare$+"No selected plus shift:|"
 MostraITastiDaUsare$+"Cursor left>.move insertion point backward|"
 MostraITastiDaUsare$+"Cursor right>move insertion point forward|"
 MostraITastiDaUsare$+"Backspace>...delete last event"
 EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"

 MostraITastiDaUsare$="With selected events:|"
 MostraITastiDaUsare$+"Cursor up>...inc sel events/tempo beat|"
 MostraITastiDaUsare$+"Cursor down>.dec sel events/tempo beat|"
 MostraITastiDaUsare$+"Cursor left>.move sel events forward|"
 MostraITastiDaUsare$+"Cursor right>move sel events backward|"
 MostraITastiDaUsare$+"Backspace>...delete last event|"
 MostraITastiDaUsare$+"|"
 MostraITastiDaUsare$+"With selected events plus shift:|"
 MostraITastiDaUsare$+"Cursor up>...move sel notes up of one octave|"
 MostraITastiDaUsare$+"             inc sel events of 10|"
 MostraITastiDaUsare$+"             inc sel tempo events measure|"
 MostraITastiDaUsare$+"Cursor down>.move sel notes down of one octave|"
 MostraITastiDaUsare$+"             dec sel events of 10|"
 MostraITastiDaUsare$+"             dec sel tempo events measure|"
 MostraITastiDaUsare$+"Cursor left>.stretch sel notes backward|"
 MostraITastiDaUsare$+"Cursor right>stretch sel notes forward|"
 MostraITastiDaUsare$+"Backspace>...delete all sel events"
 EZRequest "AmySequencer help",MostraITastiDaUsare$,"OK"

End Statement

Statement MostraLaMappaturaDelleNoteSullaTastiera{}
 MostraLaMappaturaDelleNoteSullaTastiera$="Note    lo octave hi octave|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"C--Do  >........Z.........Q|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"C#-Do# >........S.........2|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"D--Re  >........X.........W|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"D#-Re# >........D.........3|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"E--Mi  >........C.........E|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"F--Fa  >........V.........R|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"F#-Fa# >........G.........5|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"G--Sol >........B.........T|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"G#-Sol#>........H.........6|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"A--La  >........N.........Y|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"A#-La# >........J.........7|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"B--Si  >........M.........U|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"|"
 MostraLaMappaturaDelleNoteSullaTastiera$+"function keys to select octave"
 EZRequest "AmySequencer help",MostraLaMappaturaDelleNoteSullaTastiera$,"OK"
End Statement

Statement ProgressioneEventiMusicaliCurvaDiPicco{InizioProgressione.w,FineProgressione.w}
SHARED CanaleSelezionato
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
 If CanaleSelezionato>0
  Valori.b=EZRequest("AmySequencer message","How many inner values|for the progression?","1|2|4|8|16|32|64|Cancel")
  If Valori=0 Then Statement Return
  Valori=2+2^(Valori-1)
  Passo.w=(FineProgressione-InizioProgressione)/(Valori-1)
  LastItem EventoMusicale()
  For Valore.w=InizioProgressione To FineProgressione Step Passo
   If AddItem(EventoMusicale())=True
    EventoMusicale()\Tipo="PitchBend"
    EventoMusicale()\Evento=Valore/128
    EventoMusicale()\Inizio=XInizioAreaVisibile+LarghezzaEventoBase/(Valori-1)*Abs(Valore-InizioProgressione)/Passo
    EventoMusicale()\Canale=CanaleSelezionato
    EventoMusicale()\Sequenza=SequenzaSelezionata
    EventoMusicale()\Stato=#EventoMusicaleNonSelezionato
    EventoMusicale()\Durata=2
    EventoMusicale()\Valore=Valore MOD 128
    EventiMusicali+1
    EventiMusicaliSelezionati+1
   Else
    EZRequest "AmySequencer message","You have used all the available events","OK"
    ProgressioneInterrotta.b=True
    Pop For:Goto FineCicloForProgressione
   EndIf
  Next Valore
FineCicloForProgressione
  If ProgressioneInterrotta=False Then EZRequest "AmySequencer message","Progression successfully completed!","OK"
 Else
  EZRequest "AmySequencer message","You must select a channel first","OK"
 EndIf
End Statement

;---------------------------------------------------
;questa procedura permette di cambiare la nota base
;this procedure permits to change the basic note
;------------------------------------------------
Statement CambiaLEventoBase{}
SHARED AltezzaFonte
SHARED ColoriOriginali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED ParlatoAttivato
SHARED TastoCursoreDestra$
SHARED TastoCursoreSinistra$
SHARED TastoEsc$
SHARED TipoDiEventoBase$
SHARED ValoreEventoBase
SHARED XLunSlider
SHARED YLunSlider
 TipoFinestra.l=#FinestraMovibile+#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 YPosF.w=(AltezzaFonte+3)*2
 YLunF.w=AltezzaFonte+3+16+8+8+2
 If TipoDiEventoBase$<>"Program" AND TipoDiEventoBase$<>"PolyAftertouch" AND TipoDiEventoBase$<>"MonoAftertouch"
  If TipoDiEventoBase$<>"Tempo" AND TipoDiEventoBase$<>"BPM"
   YLunF+8+8
  EndIf
 EndIf
 If TipoDiEventoBase$="PitchBend" Then YLunF+8+8
 TitoloFinestra$="Basic event: "+LCase$(TipoDiEventoBase$)
 Window #FinestraCambioEventoBase,4,YPosF,4+24*10+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1
 LarghezzaInternaFinestraCambioEventoBase.w=InnerWidth
 AltezzaInternaFinestraCambioEventoBase.w=InnerHeight
 CloseWindow #FinestraCambioEventoBase
 XLunSlider=LarghezzaInternaFinestraCambioEventoBase
 YLunSlider=8
 If TipoDiEventoBase$<>"Program" AND TipoDiEventoBase$<>"PolyAftertouch" AND TipoDiEventoBase$<>"MonoAftertouch"
  If TipoDiEventoBase$<>"Tempo" AND TipoDiEventoBase$<>"BPM"
   If TipoDiEventoBase$="PitchBend"
    ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
    ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
    ImpostaSlider{3,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
   Else
    ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8-8-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
    ImpostaSlider{2,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
   EndIf
  Else
   ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
  EndIf
 Else
  ImpostaSlider{1,0,AltezzaInternaFinestraCambioEventoBase-8,"HORIZONTAL",0,#ListaGadgetCambioEventoBase}
 EndIf
 Window #FinestraCambioEventoBase,4,YPosF,4+24*10+4,YLunF,TipoFinestra,TitoloFinestra$,-1,-1,#ListaGadgetCambioEventoBase
 WindowFont #FonteDiCaratteriTopaz8
; Zona.b=NewZoneTable(#TabellaZoneCambioEventoBase,9)
; If Zona=True Then UseZoneTable #TabellaZoneCambioEventoBase Else Statement Return
; UseZoneTable #TabellaZoneEditoreSequenza
 For Zona.b=0 To 7
  WBlit Zona,24*Zona,0;:SetZone Zona,24*Zona,0,24*Zona+23,15
 Next
 WLocate 24*8+8,4:WColour 1,0:Print "3";:SetZone 8,24*8,0,24*8+23,15
 WLocate 24*9+8,4:WColour 1,0:Print "5";:SetZone 9,24*9,0,24*9+23,15
 MostraSlider{1,(LarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
 If TipoDiEventoBase$<>"Program" AND TipoDiEventoBase$<>"PolyAftertouch" AND TipoDiEventoBase$<>"MonoAftertouch"
  If TipoDiEventoBase$<>"Tempo" AND TipoDiEventoBase$<>"BPM"
   If TipoDiEventoBase$="PitchBend"
;------------------------------------------------------------------------------
;questa variabile contiene il valore finale di base dello spostamento di picco
; delle note
;this variable retains the basic pitch bend final value
;-------------------------------------------------------
    FineCurvaDiPiccoEventoBase.w=#_PitchBendCenter

;--------------------------------------------------------------------------------
;questa variabile contiene il valore iniziale di base dello spostamento di picco
; delle note
;this variable retains the basic pitch bend initial value
;---------------------------------------------------------
    InizioCurvaDiPiccoEventoBase.w=#_PitchBendCenter

    ValoreMassimo.w=16384
    Valore.w=InizioCurvaDiPiccoEventoBase
    MostraSlider{2,Valore,ValoreMassimo,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
    Valore.w=FineCurvaDiPiccoEventoBase
    MostraSlider{3,Valore,ValoreMassimo,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
   Else
    MostraSlider{2,ValoreEventoBase,127,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
   EndIf
  EndIf
 EndIf
 NuovaLarghezzaEventoBase.w=LarghezzaEventoBase
 NuovoValoreEventoBase.w=ValoreEventoBase
 NuovoInizioCurvaDiPiccoEventoBase.w=InizioCurvaDiPiccoEventoBase
 NuovaFineCurvaDiPiccoEventoBase.w=FineCurvaDiPiccoEventoBase
 EventoBaseModificato.b=False
 Repeat
  If SecondoClicDelTopo.b=False
   If TipoDiEventoBase$<>"Program" AND TipoDiEventoBase$<>"PolyAftertouch" AND TipoDiEventoBase$<>"MonoAftertouch"
    If TipoDiEventoBase$<>"Tempo" AND TipoDiEventoBase$<>"BPM"
     If TipoDiEventoBase$="PitchBend"
      WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8-8-8
     Else
      WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8-8-8
     EndIf
    Else
     WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
    EndIf
   Else
    WLocate 0,AltezzaInternaFinestraCambioEventoBase-8-8
   EndIf
   If NuovaLarghezzaEventoBase MOD 6=0
    If ColoriOriginali=True Then WColour 3,2 Else WColour 10,9
   Else
    WColour 2,1
   EndIf
   Format "0000":Print NuovaLarghezzaEventoBase:Format "":Print SPACE$(21)+"width"
   If TipoDiEventoBase$<>"Program" AND TipoDiEventoBase$<>"PolyAftertouch" AND TipoDiEventoBase$<>"MonoAftertouch"
    If TipoDiEventoBase$<>"Tempo" AND TipoDiEventoBase$<>"BPM"
     If TipoDiEventoBase$="PitchBend"
      Y.w=AltezzaInternaFinestraCambioEventoBase-8-8-8-8
      WLocate 0,Y:WColour 1,0:Format "+0000"
      Print NuovoInizioCurvaDiPiccoEventoBase-#_PitchBendCenter:Format ""
      Valore$="initial"
     Else
      Y=AltezzaInternaFinestraCambioEventoBase-8-8
      WLocate 0,Y:WColour 1,0:Format "000":Print NuovoValoreEventoBase:Format ""
      If TipoDiEventoBase$="Note" Then Valore$="velocity"
      If TipoDiEventoBase$="Control" Then Valore$="value"
     EndIf
     WLocate (30-Len(Valore$))*8,Y:Print Valore$
    EndIf
   EndIf
   If TipoDiEventoBase$="PitchBend"
    Y=AltezzaInternaFinestraCambioEventoBase-8-8
    WLocate 0,Y:WColour 1,0:Format "+0000"
    Print NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter:Format ""
    Valore$="final":WLocate (30-Len(Valore$))*8,Y:Print Valore$
   EndIf
   SecondoClicDelTopo=True
  EndIf
  Repeat
   If ParlatoAttivato=True AND Parlato$<>"" AND Timer-TempoTrascorso.l>49 Then Speak Parlato$:Parlato$=""
   EventoFinestraCambioEventoBase.l=Event
  Until EventoFinestraCambioEventoBase>0
  Select EventoFinestraCambioEventoBase
  Case #HaiPremutoUnTastoDelTopo
   XTopo.w=WMouseX:YTopo.w=WMouseY:TastoDelTopoCliccato.b=MButtons
   Select TastoDelTopoCliccato
   Case #TastoSinistroDelTopoPremuto
    XZonaTopo.b=XTopo/24+1:YZonaTopo.b=YTopo>=0 AND YTopo<16
    If YZonaTopo=True
     Select XZonaTopo
     Case 1
      NuovaLarghezzaEventoBase=192*4:NotaPuntata.w=0:Terzina.b=0:Cinquina.b=0
      Parlato$="You have choosen a whole note width"
     Case 2
      NuovaLarghezzaEventoBase=192*2:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a half note width"
     Case 3
      NuovaLarghezzaEventoBase=192:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a quarter note width"
     Case 4
      NuovaLarghezzaEventoBase=192/2:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen an eighth note width"
     Case 5
      NuovaLarghezzaEventoBase=192/4:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a sixteenth note width"
     Case 6
      NuovaLarghezzaEventoBase=192/8:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a thirty second note width"
     Case 7
      NuovaLarghezzaEventoBase=192/16:NotaPuntata=0:Terzina=0:Cinquina=0
      Parlato$="You have choosen a sixty fourth note width"
     Case 8
      If NotaPuntata=0
       NotaPuntata=NuovaLarghezzaEventoBase/2
       NuovaLarghezzaEventoBase+NotaPuntata
       If Terzina>0
        Terzina=0
        Parlato$="You have no more a triplet note width, you have choosen a dotted note width"
       Else
        If Cinquina>0
         Cinquina=0
         Parlato$="You have no more a quintet note width, you have choosen a dotted note width"
        Else
         Parlato$="You have choosen a dotted note width"
        EndIf
       EndIf
      Else
       NuovaLarghezzaEventoBase/3*2
       NotaPuntata=0
       Parlato$="You have no more a dotted note width"
      EndIf
     Case 9
      If Terzina=0 AND NuovaLarghezzaEventoBase>5
       Terzina=3:NuovaLarghezzaEventoBase/Terzina
       If NotaPuntata>0
        NotaPuntata=0
        Parlato$="You have no more a dotted note width, you have choosen a triplet note width"
       Else
        If Cinquina>0
         Cinquina=0
         Parlato$="You have no more a quintet note width, you have choosen a triplet note width"
        Else
         Parlato$="You have choosen a triplet note width"
        EndIf
       EndIf
      Else
       NuovaLarghezzaEventoBase*Terzina
       Terzina=0
       Parlato$="You have no more a triplet note width"
      EndIf
     Case 10
      If Cinquina=0 AND NuovaLarghezzaEventoBase>9
       Cinquina=5:NuovaLarghezzaEventoBase/Cinquina
       If NotaPuntata>0
        NotaPuntata=0
        Parlato$="You have no more a dotted note width, you have choosen a quintet note width"
       Else
        If Terzina>0
         Parlato$="You have no more a triplet note width, you have choosen a quintet note width"
        Else
         Parlato$="You have choosen a quintet note width"
        EndIf
       EndIf
      Else
       NuovaLarghezzaEventoBase*Cinquina
       Cinquina=0
       Parlato$="You have no more a quintet note width"
      EndIf
     End Select
     If XZonaTopo>0 AND XZonaTopo<11
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
      Parlato$+", that are "+Str$(NuovaLarghezzaEventoBase)+" ticks."
     EndIf
    EndIf
    SecondoClicDelTopo=False
    TempoTrascorso=Timer
   Case 5
    SecondoClicDelTopo=True
   End Select
;  Case #HaiPremutoUnGadget
;   XLunSlider=LarghezzaInternaFinestraCambioEventoBase
;   Select GadgetHit
;   Case 1
;    NuovaLarghezzaEventoBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
;    NotaPuntata=0:Terzina=0
;    Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
;   Case 2
;    If TipoDiEventoBase$="PitchBend"
;     NuovoInizioCurvaDiPiccoEventoBase=ValoreSlider{2,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
;    Else
;     NuovoValoreEventoBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
;    EndIf
;    If TipoDiEventoBase$="Note" Then Parlato$="You have choosen a note velocity of "+Str$(NuovoValoreEventoBase)+"."
;    If TipoDiEventoBase$="Control" Then Parlato$="You have choosen a value of "+Str$(NuovoValoreEventoBase)+"."
;    If TipoDiEventoBase$="PitchBend"
;    Parlato$="You have choosen a bend inital value of "+Str$(NuovoInizioCurvaDiPiccoEventoBase-#_pitchBendCenter)+"."
;    EndIf
;   Case 3
;    NuovaFineCurvaDiPiccoEventoBase=ValoreSlider{3,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
;    Parlato$="You have choosen a bend final value of "+Str$(NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
;   End Select
;   SecondoClicDelTopo=False
;   TempoTrascorso=Timer
  Case #HaiRilasciatoUnGadget
   XLunSlider=LarghezzaInternaFinestraCambioEventoBase
   Select GadgetHit
   Case 1
    NuovaLarghezzaEventoBase=ValoreSlider{1,(192*6-2)/2,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}*2+2
    NotaPuntata=0:Terzina=0
    Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
   Case 2
    If TipoDiEventoBase$="PitchBend"
     NuovoInizioCurvaDiPiccoEventoBase=ValoreSlider{2,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    Else
     NuovoValoreEventoBase=ValoreSlider{2,127,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    EndIf
    If TipoDiEventoBase$="Note" Then Parlato$="You have choosen a note velocity of "+Str$(NuovoValoreEventoBase)+"."
    If TipoDiEventoBase$="Control" Then Parlato$="You have choosen a value of "+Str$(NuovoValoreEventoBase)+"."
    If TipoDiEventoBase$="PitchBend"
     Parlato$="You have choosen a bend initial value of "+Str$(NuovoInizioCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
    EndIf
   Case 3
    NuovaFineCurvaDiPiccoEventoBase=ValoreSlider{3,16384,XLunSlider,"HORIZONTAL",#ListaGadgetCambioEventoBase}
    Parlato$="You have choosen a bend final value of "+Str$(NuovaFineCurvaDiPiccoEventoBase-#_PitchBendCenter)+"."
   End Select
   SecondoClicDelTopo=False
   TempoTrascorso=Timer
  Case #HaiChiusoLaFinestra
   EsciDalCambioEventoBase=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$)
   Select TastoPremuto$
   Case TastoEsc$
    EsciDalCambioEventoBase=True
   Case TastoCursoreDestra$
    If NuovaLarghezzaEventoBase<192*6-2
     NuovaLarghezzaEventoBase+2:NotaPuntata=0:Terzina=0:Cinquina=0
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
    EndIf
   Case TastoCursoreSinistra$
    If NuovaLarghezzaEventoBase>3
     NuovaLarghezzaEventoBase-2:NotaPuntata=0:Terzina=0:Cinquina=0
MostraSlider{1,(NuovaLarghezzaEventoBase-2)/2,(192*6-2)/2,"HORIZONTAL",#ListaGadgetCambioEventoBase,#FinestraCambioEventoBase}
     Parlato$="You have choosen a note width of "+Str$(NuovaLarghezzaEventoBase)+" ticks."
    EndIf
   End Select
   SecondoClicDelTopo=False
   TempoTrascorso=Timer
  End Select
 Until EsciDalCambioEventoBase=True
 If NuovaLarghezzaEventoBase<>LarghezzaEventoBase Then EventoBaseModificato=True
 If NuovoValoreEventoBase<>ValoreEventoBase Then EventoBaseModificato=True
 LarghezzaEventoBase=NuovaLarghezzaEventoBase
 ValoreEventoBase=NuovoValoreEventoBase
 If EventiMusicaliSelezionati>0
  If EventoBaseModificato=True
   Messaggio$="You have made changes:"
  Else
   Messaggio$="You have made no changes:"
  EndIf
  Messaggio$+"|Would you apply the current|settings to the selected events?"
  ApplicaINuoviValoriAgliEventiMusicaliSelezionati.b=EZRequest("AmySequencer message",Messaggio$,"Yes|No")
  If ApplicaINuoviValoriAgliEventiMusicaliSelezionati=1
   Select TipoDiEventoBase$
   Case "Note"
    AggiustaInizio.b=EZRequest("AmySequencer message","Quantize notes start?","Yes|No")
    AggiustaDurata.b=EZRequest("AmySequencer message","Quantize notes length?","Yes|No")
    AggiustaValore.b=EZRequest("AmySequencer message","Change notes velocity?","Yes|No")
   Case "Program"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "Control"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize controls start?","Yes|No")
    AggiustaValore=EZRequest("AmySequencer message","Change controls value?","Yes|No")
   Case "PolyAftertouch"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "MonoAftertouch"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize programs start?","Yes|No")
   Case "PitchBend"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize pitch bends start?","Yes|No")
   Case "Tempo"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize tempo events start?","Yes|No")
   Case "BPM"
    AggiustaInizio=EZRequest("AmySequencer message","Quantize BPM events start?","Yes|No")
   End Select
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    StatoEventoMusicale.b=EventoMusicale()\Stato
    SelezioneEventoMusicale.b=StatoEventoMusicale & #EventoMusicaleSelezionato
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato
     Select EventoMusicale()\Tipo
     Case "Note"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
      If AggiustaDurata=1 Then EventoMusicale()\Durata/LarghezzaEventoBase*LarghezzaEventoBase
      If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoBase
     Case "Program"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "PolyAftertouch"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "MonoAftertouch"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "Control"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
      If AggiustaValore=1 Then EventoMusicale()\Valore=ValoreEventoBase
     Case "PitchBend"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "Tempo"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     Case "BPM"
      If AggiustaInizio=1 Then EventoMusicale()\Inizio/LarghezzaEventoBase*LarghezzaEventoBase
     End Select
    EndIf
   Wend
  EndIf
 EndIf
 If NuovoInizioCurvaDiPiccoEventoBase<>InizioCurvaDiPiccoEventoBase Then Progressione.b=True
 If NuovaFineCurvaDiPiccoEventoBase<>FineCurvaDiPiccoEventoBase Then Progressione=True
 If Progressione=True
  ProgressioneEventiMusicaliCurvaDiPicco{NuovoInizioCurvaDiPiccoEventoBase,NuovaFineCurvaDiPiccoEventoBase}
  InizioCurvaDiPiccoEventoBase=NuovoInizioCurvaDiPiccoEventoBase
  FineCurvaDiPiccoEventoBase=NuovaFineCurvaDiPiccoEventoBase
 EndIf

;*************************************************************
;la seguente linea se attivata da' errore quando non dovrebbe
;the following line if avtivated gives an error when it should not do
;*********************************************************************
; FreeZoneTable(#TabellaZoneCambioEventoBase)

 CloseWindow #FinestraCambioEventoBase
 Use Window #FinestraEditoreSequenza

;***************************************************
;il seguente comando sembra non avere alcun effetto
;the following command seems have no effect
;*******************************************
; UseZoneTable #TabellaZoneEditoreSequenza

End Statement

;---------------------------------------------------------------
;this procedure states the selected by mouse event new position
;questa procedura mostra la nuova posizione dell'evento selezionato col mouse
;-----------------------------------------------------------------------------
Statement MostraNuovaPosizioneEvento{XEvento.l,YEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED MostraNuovoValore
SHARED ScalaEventiMusicali
SHARED TipoDiEventoBase$
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
 X0.w=16+(XEvento-XInizioAreaVisibile)/ScalaEventiMusicali
 Select TipoDiEventoBase$
 Case "Note"
  Y0.w=(127-YInizioAreaVisibile-YEvento)*8
  X1.w=X0+(LarghezzaEventoBase-1)/ScalaEventiMusicali
 Case "Program"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Program000X")*8-1
 Case "Control"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Control000X")*8-1
 Case "PolyAftertouch"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Poly000X")*8-1
 Case "MonoAftertouch"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Mono000X")*8-1
 Case "PitchBend"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Bend+0000X")*8-1
 Case "Tempo"
  Y0=AreaVisibileDeiValori*Max((127-YEvento+1),0)/127
  X1=X0+Len("Tempo00/00X")*8-1
 Case "BPM"
  Y0=AreaVisibileDeiValori*Max((97-YEvento+1),0)/97
  X1=X0+Len("BPM000X")*8-1
 End Select
 Y1.w=Y0+7
 X0=Min(Max(X0,16),LarghezzaInternaFinestraEditoreSequenza-1)
 Y0=Min(Max(Y0,0),AltezzaInternaFinestraEditoreSequenza-1-8-8-7)
 X1=Min(Max(X1,16),LarghezzaInternaFinestraEditoreSequenza-1)
 Y1=Min(Max(Y1,7),AltezzaInternaFinestraEditoreSequenza-1-8-8)
 WJam #SecondaVoltaStessoColore
 If MostraNuovoValore=True
  WLocate X0,Y0
  Select TipoDiEventoBase$
  Case "Note"
   Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
  Case "Program"
   Format "000":Print "Program",Str$(YEvento),"X":Format ""
  Case "Control"
   Format "000":Print "Control",Str$(YEvento),"X":Format ""
  Case "PolyAftertouch"
   Format "000":Print "Poly",Str$(YEvento),"X":Format ""
  Case "MonoAftertouch"
   Format "000":Print "Mono",Str$(YEvento),"X":Format ""
  Case "PitchBend"
   Format "+0000":Print "Bend",Str$(YEvento*128+EventoMusicale()\Valore-#_PitchBendCenter),"X":Format ""
  Case "Tempo"
   Format "00":Print "Tempo",Str$(YEvento MOD 16+1),"/",Str$(YEvento/16+1),"X":Format ""
  Case "BPM"
   Format "000":Print "BPM",Str$(9+YEvento*3+EventoMusicale()\Valore),"X":Format ""
  End Select
 Else
  Wline X0,Y0,X1,Y0,X1,Y1,X0,Y1,X0,Y0,0
 EndIf
 WJam #DueColoriConSfondoPieno
End Statement

;------------------------------------------------------------------------------
;questa procedura permette di spostare gli eventi selezionati cliccando con il
; mouse su uno di essi
;this procedure permits to move the selected events clicking on one of these
;----------------------------------------------------------------------------
Statement MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneEvento.l,YPosizioneEvento.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaEventoBase
SHARED Misure
SHARED MostraNuovoValore
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED XInizioAreaVisibile
SHARED YInizioAreaVisibile
SHARED YPosizioneNota
 Repeat
  NuovaXTopo.w=WMouseX:NuovaYTopo.w=WMouseY:TastoDelTopoPremuto.b=Joyb(0)
  TipoDiEventoBase$=EventoMusicale()\Tipo
  InizioEvento.l=EventoMusicale()\Inizio
  CanaleEvento.b=EventoMusicale()\Canale
  Select TipoDiEventoBase$
  Case "Note"
   XNuovaPosizioneNota.l=(XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizioneNota.b=127-YInizioAreaVisibile-NuovaYTopo/8
   If XNuovaPosizioneNota<>XPosizioneEvento
    IncrementoXEventoMusicale.l=XNuovaPosizioneNota-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneNota<>YPosizioneEvento
    IncrementoYEventoMusicale.b=YNuovaPosizioneNota-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Note>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Program"
   XNuovaPosizioneProgramma.l=(XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizioneProgramma.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneProgramma<0
    If NuovaYTopo<0 Then YNuovaPosizioneProgramma=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneProgramma=0
   EndIf
   If XNuovaPosizioneProgramma<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneProgramma-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneProgramma<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneProgramma-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Program>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "Control"
   XNuovaPosizioneControllo.l=(XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizioneControllo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneControllo<0
    If NuovaYTopo<0 Then YNuovaPosizioneControllo=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneControllo=0
   EndIf
   If XNuovaPosizioneControllo<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneControllo-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneControllo<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneControllo-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Control>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "PolyAftertouch"
   XNuovaPosizionePressioneMultipla.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizionepressioneMultipla/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizionePressioneMultipla.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizionePressioneMultipla<0
    If NuovaYTopo<0 Then YNuovaPosizionePressioneMultipla=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizionePressioneMultipla=0
   EndIf
   If XNuovaPosizionePressioneMultipla<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizionePressioneMultipla-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizionePressioneMultipla<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizionePressioneMultipla-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Poly>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "MonoAftertouch"
   XNuovaPosizionePressioneSingola.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizionePressioneSingola/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizionePressioneSingola.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizionePressioneSingola<0
    If NuovaYTopo<0 Then YNuovaPosizionePressioneSingola=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizionePressioneSingola=0
   EndIf
   If XNuovaPosizionePressioneSingola<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizionePressioneSingola-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizionePressioneMultipla<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizionePressioneSingola-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Mono>"+Str$(IncrementoYEventoMusicale)
   EndIf
  Case "PitchBend"
   XNuovaPosizioneCurvaDiPicco.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneCurvaDiPicco/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizioneCurvaDiPicco.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneCurvaDiPicco<0
    If NuovaYTopo<0 Then YNuovaPosizioneCurvaDiPicco=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneCurvaDiPicco=0
   EndIf
   If XNuovaPosizioneCurvaDiPicco<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneCurvaDiPicco-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneCurvaDiPicco<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneCurvaDiPicco-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    Messaggio$="Bend>"+Str$(IncrementoYEventoMusicale*128)
   EndIf
  Case "Tempo"
   XNuovaPosizioneTempo.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneTempo/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizioneTempo.b=127-NuovaYTopo*127/AreaVisibileDeiValori
   If YNuovaPosizioneTempo<0
    If NuovaYTopo<0 Then YNuovaPosizioneTempo=127
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneTempo=0
   EndIf
   If XNuovaPosizioneTempo<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneTempo-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneTempo<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneTempo-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    NuoviBattiti.b=IncrementoYEventoMusicale MOD 16
    NuoveMisure.b=Abs(IncrementoYEventoMusicale/16)
    Messaggio$="Tempo>":If Sgn(IncrementoYEventoMusicale)=-1 Then Messaggio$+"-"
    Messaggio$+Str$(NuoviBattiti)+"/"+Str$(NuoveMisure)
   EndIf
  Case "BPM"
   XNuovaPosizioneBattutePerMinuto.l=XInizioAreaVisibile+(NuovaXTopo-16)*ScalaEventiMusicali
   XNuovaPosizioneBattutePerMinuto/LarghezzaEventoBase*LarghezzaEventoBase
   YNuovaPosizioneBattutePerMinuto.b=97-NuovaYTopo*97/AreaVisibileDeiValori
   If YNuovaPosizioneBattutePerMinuto<0

;---------------------------------------------------------------------------
;il valore massimo per le battute per minuto e' di 97*3, cioe' 291, piu' il
; valore di partenza che e' 10, meno 1 dato che questo e' compreso, fa 300
;the maximum value for BPM events is 97*3, that is 291, plus the start value
; that is 10, minus 1 seen that this is included, it gives 300
;--------------------------------------------------------------
    If NuovaYTopo<0 Then YNuovaPosizioneBattutePerMinuto=97

;----------------------------------------------------------------------------
;il valore minimo per le battute per minuto e' di 10, che corrisponde a zero
; dato che viene sommato in seguito
;the minimum value for BPM events is 10, that correspond to zero seen that it
; is added after
;----------------
    If NuovaYTopo>AreaVisibileDeiValori Then YNuovaPosizioneBattutePerMinuto=0

   EndIf
   If XNuovaPosizioneBattutePerMinuto<>XPosizioneEvento
    IncrementoXEventoMusicale=XNuovaPosizioneBattutePerMinuto-XPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoXEventoMusicale=0
   EndIf
   If YNuovaPosizioneBattutePerMinuto<>YPosizioneEvento
    IncrementoYEventoMusicale=YNuovaPosizioneBattutePerMinuto-YPosizioneEvento
    EventoMusicaleSpostatoConIlTopo=True
   Else
    IncrementoYEventoMusicale=0
   EndIf
   If IncrementoXEventoMusicale=0 AND IncrementoYEventoMusicale=0
    EventoMusicaleSpostatoConIlTopo=False
   Else
    BattutePerMinuto.w=IncrementoYEventoMusicale*3+EventoMusicale()\Valore
    Messaggio$="BPM>"+Str$(BattutePerMinuto)
   EndIf
  End Select
  Select TipoDiEventoBase$
  Case "Note"
   NuovaXEvento.l=XNuovaPosizioneNota:NuovaYEvento.b=YNuovaPosizioneNota
  Case "Program"
   NuovaXEvento=XNuovaPosizioneProgramma:NuovaYEvento=YNuovaPosizioneProgramma
  Case "Control"
   NuovaXEvento=XNuovaPosizioneControllo:NuovaYEvento=YNuovaPosizioneControllo
  Case "PolyAftertouch"
   NuovaXEvento=XNuovaPosizionePressioneMultipla:NuovaYEvento=YNuovaPosizionePressioneMultipla
  Case "MonoAftertouch"
   NuovaXEvento=XNuovaPosizionePressioneSingola:NuovaYEvento=YNuovaPosizionePressioneSingola
  Case "PitchBend"
   NuovaXEvento=XNuovaPosizioneCurvaDiPicco:NuovaYEvento=YNuovaPosizioneCurvaDiPicco
  Case "Tempo"
   NuovaXEvento=XNuovaPosizioneTempo:NuovaYEvento=YNuovaPosizioneTempo
  Case "BPM"
   NuovaXEvento=XNuovaPosizioneBattutePerMinuto:NuovaYEvento=YNuovaPosizioneBattutePerMinuto
  End Select
  MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
  If EventoMusicaleSpostatoConIlTopo=False
   Messaggio$="No change made"
  EndIf
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate XMessaggio,YMessaggio
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
  WColour CanaleSelezionato-1,16-CanaleSelezionato
  Print Messaggio$
  If EventoMusicaleSpostatoConIlTopo=True
   Print " pos>":ConvertiIlTempoInBattute{IncrementoXEventoMusicale,Battiti,Misure,False}
  EndIf
  VWait
  MostraNuovaPosizioneEvento{NuovaXEvento,NuovaYEvento}
 Until TastoDelTopoPremuto<>#TastoSinistroDelTopoPremuto
 If EventoMusicaleSpostatoConIlTopo=True
  PushItem EventoMusicale()
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=SequenzaSelezionata
    StatoEventoMusicale.b=EventoMusicale()\Stato
    SelezioneEventoMusicale.b=StatoEventoMusicale & #EventoMusicaleSelezionato
    If EventoMusicale()\Tipo=TipoDiEventoBase$ AND SelezioneEventoMusicale=#EventoMusicaleSelezionato
     EventoMusicale()\Evento+IncrementoYEventoMusicale
     If TipoDiEventoBase$="BPM"
      EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),97)
      If EventoMusicale()\Evento=97 Then EventoMusicale()\Valore=0
      If EventoMusicale()\Evento=0 Then EventoMusicale()\Valore=1
     Else
      EventoMusicale()\Evento=Min(Max(EventoMusicale()\Evento,0),127)
     EndIf
     EventoMusicale()\Inizio+IncrementoXEventoMusicale
     If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
     DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
    EndIf
   EndIf
  Wend
  PopItem EventoMusicale()
 EndIf
End Statement

;----------------------------------------
;questa procedura suona la nota corrente
;this procedure plays the current note
;--------------------------------------
Statement SuonaLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED Suono()
SHARED VoceSpenta
SHARED VoceUsata
 For Suono.b=0 To 31
  If Suono(Suono)\Canale=CanaleNota Then Pop For:Goto FineCicloForEsecutoreNote
 Next Suono
FineCicloForEsecutoreNote
 If Suono<32
  If Suono(Suono)\Canale>0
   Periodo.l=PeriFreq(Nota)\Periodo
   If Periodo>=#PeriodoMinimo AND Periodo<65536
    If VoceSpenta>0
     If VoceSpenta BitTst 0=True Then Voce.b=1:VoceSpenta BitClr 0:Goto SuonaCampione
     If VoceSpenta BitTst 1=True Then Voce=2:VoceSpenta BitClr 1:Goto SuonaCampione
     If VoceSpenta BitTst 2=True Then Voce=4:VoceSpenta BitClr 2:Goto SuonaCampione
     If VoceSpenta BitTst 3=True Then Voce=8:VoceSPenta BitClr 3
    EndIf
SuonaCampione
    SetPeriod Suono,Periodo:Sound Suono,Voce
    VoceUsata | Voce
    Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
    NoteSuonate+1
   EndIf
  EndIf
 Else
  If MIDIAttivato=True
   ByteDiStatoMIDI.b=#_NoteOn+(CanaleNota-1)
   WriteSerial 0,ByteDiStatoMIDI
   WriteSerial 0,Nota
   WriteSerial 0,VelocitaNota
   Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
   NoteSuonate+1
  EndIf
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleNota-1,16-CanaleNota
  Print Messaggio$
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue il cambio di programma
;this procedure executes the program change
;-------------------------------------------
Statement EseguiIlCambioDiProgramma{Programma.b,CanaleProgramma.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ProgramChange+(CanaleProgramma-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,Programma
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=16*16+8*3+8*4+8*6
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Program>"+Str$(Programma)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanaleProgramma-1,16-CanaleProgramma
   Print Messaggio$
  EndIf
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue il cambio di controllo
;this procedure executes the control change
;-------------------------------------------
Statement EseguiIlCambioDiControllo{Controllo.b,ValoreControllo,CanaleControllo.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ControlChange+(CanaleControllo-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,Controllo
  WriteSerial 0,ValoreControllo
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=16*16+8*3+8*4+8*6
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Control>"+Str$(Controllo)+" val>"+Str$(ValoreControllo)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanaleControllo-1,16-CanaleControllo
   Print Messaggio$
  EndIf
 EndIf
End Statement

;----------------------------------------------
;questa procedura esegue la pressione multipla
;this procedure executes the polyphonic pressure
;------------------------------------------------
Statement EseguiLaPressioneMultipla{PressioneMultipla.b,CanalePressioneMultipla.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_PolyphonicKeyPressure+(CanalePressioneMultipla-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,PressioneMultipla
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=16*16+8*3+8*4+8*6
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Poly>"+Str$(PressioneMultipla)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanalePressioneMultipla-1,16-CanalePressioneMultipla
   Print Messaggio$
  EndIf
 EndIf
End Statement

;---------------------------------------------
;questa procedura esegue la pressione singola
;this procedure executes the single pressure
;--------------------------------------------
Statement EseguiLaPressioneSingola{PressioneSingola.b,CanalePressioneSingola.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_ChannelKeyPressure+(CanalePressioneSingola-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,PressioneMultipla
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=16*16+8*3+8*4+8*6
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Mono>"+Str$(PressioneMultipla)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanalePressioneSingola-1,16-CanalePressioneSingola
   Print Messaggio$
  EndIf
 EndIf
End Statement

;-----------------------------------------------
;questa procedura esegue la variazione di picco
;this procedure executes the pitch bending
;------------------------------------------
Statement EseguiLaCurvaDiPicco{CurvaDiPicco.w,CanaleCurvaDiPicco.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  ByteDiStatoMIDI.b=#_PitchBend+(CanaleCurvaDiPicco-1)
  WriteSerial 0,ByteDiStatoMIDI
  WriteSerial 0,CurvaDiPicco MOD 128
  WriteSerial 0,CurvaDiPicco/128
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   XMessaggio.w=16*16+8*3+8*4+8*6
   YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
   Messaggio$="Bend>"+Str$(CurvaDiPicco-#_PitchBendCenter)
   Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
   WLocate XMessaggio,YMessaggio
   WColour CanaleCurvaDiPicco-1,16-CanaleCurvaDiPicco
   Print Messaggio$
  EndIf
 EndIf
End Statement

;-----------------------------------------------------
;questa procedura interrompe la nota suonata corrente
;this procedure stops the current played note
;---------------------------------------------
Statement SmettiDiSuonareLaNota{Nota.b,VelocitaNota.b,CanaleNota.b,Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
SHARED NoteSuonate
SHARED PeriFreq()
SHARED VoceSpenta
SHARED VoceUsata
 If VoceUsata>0
  If VoceUsata BitTst 0=True Then Voce.b=1:Goto FermaCampione
  If VoceUsata BitTst 1=True Then Voce=2:Goto FermaCampione
  If VoceUsata BitTst 2=True Then Voce=4:Goto FermaCampione
  If VoceUsata BitTst 3=True Then Voce=8
FermaCampione
  Quiet Voce
  VoceSpenta | Voce
  Messaggio$="Note>"+Str$(Nota)+" frequency>"+Str$(PeriFreq(Nota)\Frequenza)
  NoteSuonate-1
 Else
  If MIDIAttivato=True
   ByteDiStatoMIDI=#_NoteOff+(CanaleNota-1)
   WriteSerial 0,ByteDiStatoMIDI
   WriteSerial 0,Nota
   WriteSerial 0,VelocitaNota
   Messaggio$="Note>"+Str$(Nota)+" vel>"+Str$(VelocitaNota)
   NoteSuonate-1
  EndIf
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$+" stopped"
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour CanaleNota-1,16-CanaleNota
  Print Messaggio$
 EndIf
End Statement

;----------------------------------------------------------
;questa procedura interrompe l'esecuzione di tutte le note
;this procedure stops all notes execution
;-----------------------------------------
Statement InterrompiTutteLeNote{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED MIDIAttivato
 If MIDIAttivato=True
  For CanaleNote.b=1 To 16
   EseguiIlCambioDiControllo{#_AllNotesOff,127,CanaleNota,Modo}
   EseguiIlCambioDiControllo{#_ResetCtrl,127,CanaleNota,Modo}
  Next CanaleNote
 EndIf
 Quiet %1111
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  Messaggio$="All notes off"
  Messaggio$+SPACE$(80-XMessaggio/8-Len(Messaggio$))
  WLocate XMessaggio,YMessaggio
  WColour 1,0
  Print Messaggio$
 EndIf
End Statement

;-------------------------------------------------------
;questa procedura imposta il menu dell'editore sequenza
;this procedure sets the sequence editor menu
;---------------------------------------------
Statement ImpostaMenuEditoreSequenza{}
SHARED MostraEventiMusicaliDelloStessoTipoDaSoli
SHARED MostraNuovoValore
SHARED TipoDiEventoBase$

 Free MenuList #ListaMenuEditoreSequenza

 MenuTitle #ListaMenuEditoreSequenza,0,"Controls"
 MenuItem #ListaMenuEditoreSequenza,0,0,0,"Play"
 MenuItem #ListaMenuEditoreSequenza,0,0,1,"Record"

 MenuTitle #ListaMenuEditoreSequenza,1,"Event type"
 Select TipoDiEventoBase$
 Case "Note"
  MenuItem #ListaMenuEditoreSequenza,4,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,4,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,4,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "PolyAftertouch"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,4,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "MonoAftertouch"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,4,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,4,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,4,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,2,1,7,"  BPM"
 Case "BPM"
  MenuItem #ListaMenuEditoreSequenza,2,1,0,"  Note"
  MenuItem #ListaMenuEditoreSequenza,2,1,1,"  Program"
  MenuItem #ListaMenuEditoreSequenza,2,1,2,"  Control"
  MenuItem #ListaMenuEditoreSequenza,2,1,3,"  PolyPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,4,"  MonoPressure"
  MenuItem #ListaMenuEditoreSequenza,2,1,5,"  PitchBend"
  MenuItem #ListaMenuEditoreSequenza,2,1,6,"  Tempo"
  MenuItem #ListaMenuEditoreSequenza,4,1,7,"  BPM"
 End Select
 If MostraEventiMusicaliDelloStessoTipoDaSoli=True
  MenuItem #ListaMenuEditoreSequenza,3,1,8,"  Alone"
 Else
  MenuItem #ListaMenuEditoreSequenza,1,1,8,"  Alone"
 EndIf

 MenuTitle #ListaMenuEditoreSequenza,2,"Settings"
 MenuItem #ListaMenuEditoreSequenza,0,2,0,"Basic event"
 If MostraNuovoValore=True
  MenuItem #ListaMenuEditoreSequenza,3,2,1,"  Show dragged event value"
 Else
  MenuItem #ListaMenuEditoreSequenza,1,2,1,"  Show dragged event value"
 EndIf

 MenuTitle #ListaMenuEditoreSequenza,3,"Help"
 MenuItem #ListaMenuEditoreSequenza,0,3,0,"Keys to use"
 MenuItem #ListaMenuEditoreSequenza,0,3,1,"Notes on keys"

;-------------------------------
;attacca il menu' alla finestra
;attaches menu to window
;------------------------
 SetMenu #ListaMenuEditoreSequenza

End Statement

;----------------------------------------------
;questa procedura modifica gli eventi musicali
;this procedure modifies the musical events
;-------------------------------------------
Statement Selezione{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED EventoMusicaleSelezionato
SHARED EventoMusicaleSpostatoConIlTopo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoBase
SHARED MIDIAttivato
SHARED Misure
SHARED NotaSuonata
SHARED PeriFreq()
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED Suono()
SHARED TastoDelTopoCliccato
SHARED TipoDiEventoBase$
SHARED ValoreEventoBase
SHARED XInizioAreaVisibile
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YTopo
 ResetList EventoMusicale()
 StessoEvento.b=%00000
 XTopo=Min(Max(XTopo,16),LarghezzaInternaFinestraEditoreSequenza-1)
 While NextItem(EventoMusicale())=True
  StessoEvento=%00000
  TipoDiEventoMusicaleSelezionato$=EventoMusicale()\Tipo
  InizioEvento.l=EventoMusicale()\Inizio
  CanaleEvento.b=EventoMusicale()\Canale
  SequenzaEvento.w=EventoMusicale()\Sequenza
  SelezioneEventoMusicale.b=EventoMusicale()\Stato & #EventoMusicaleSelezionato
  If Modo=#SelezionaUnEvento
   Select TipoDiEventoMusicaleSelezionato$
   Case "Note"
    YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
    Nota.b=EventoMusicale()\Evento
    DurataNota.l=EventoMusicale()\Durata
    FineNota.l=InizioEvento+DurataNota-1
    VelocitaNota.b=EventoMusicale()\Valore
    XPosizioneNota.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizioneNota.b=127-YInizioAreaVisibile-YTopo/8
    If XPosizioneNota>=InizioEvento Then StessoEvento | %00001
    If XPosizioneNota<=FineNota Then StessoEvento | %00010
    If YPosizioneNota=Nota Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento.b=EZRequest("AmySequencer message","Would you add a new note|with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneNota,YPosizioneNota}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      Else
       Nota=EventoMusicale()\Evento
       InizioNota=EventoMusicale()\Inizio
      EndIf
     Else
      NotaPiuLunga.l=DurataNota
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     NotaSuonata\Evento=Nota,0,CanaleEvento
     NotaSuonata\Durata=DurataNota,VelocitaNota
     SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
     NotaSuonata\Stato=True
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "Program"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    Programma.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Program000")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FineProgramma.w=InizioEvento+LunghezzaEvento-1
    XPosizioneProgramma.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizioneProgramma.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneProgramma>=InizioEvento Then StessoEvento | %00001
    If XPosizioneProgramma<=FineProgramma Then StessoEvento | %00010
    If YPosizioneProgramma=Programma Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new program|with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneProgramma,YPosizioneProgramma}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "Control"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    Controllo.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Control000")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FineControllo.w=InizioEvento+LunghezzaEvento-1
    XPosizioneControllo.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizioneControllo.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneControllo>=InizioEvento Then StessoEvento | %00001
    If XPosizioneControllo<=FineControllo Then StessoEvento | %00010
    If YPosizioneControllo=Controllo Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new control|with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneControllo,YPosizioneControllo}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "PolyAftertouch"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    PressioneMultipla.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Poly000")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FinePressioneMultipla.w=InizioEvento+LunghezzaEvento-1
    XPosizionePressioneMultipla.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizionePressioneMultipla.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizionePressioneMultipla>=InizioEvento Then StessoEvento | %00001
    If XPosizionePressioneMultipla<=FinePressioneMultipla Then StessoEvento | %00010
    If YPosizionePressioneMultipla=PressioneMultipla Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new poly|pressure with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizionePressioneMultipla,YPosizionePressioneMultipla}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "MonoAftertouch"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    PressioneSingola.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Mono000")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FinePressioneSingola.w=InizioEvento+LunghezzaEvento-1
    XPosizionePressioneSingola.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizionePressioneSingola.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizionePressioneSingola>=InizioEvento Then StessoEvento | %00001
    If XPosizionePressioneSingola<=FinePressioneSingola Then StessoEvento | %00010
    If YPosizionePressioneSingola=PressioneSingola Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new mono|pressure with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizionePressioneSingola,YPosizionePressioneSingola}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "PitchBend"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    CurvaDiPicco.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Bend+0000")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FineCurvaDiPicco.w=InizioEvento+LunghezzaEvento-1
    XPosizioneCurvaDiPicco.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizioneCurvaDiPicco.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneCurvaDiPicco>=InizioEvento Then StessoEvento | %00001
    If XPosizioneCurvaDiPicco<=FineCurvaDiPicco Then StessoEvento | %00010
    If YPosizioneCurvaDiPicco=CurvaDiPicco Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new pitch bend|with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneCurvaDiPicco,YPosizioneCurvaDiPicco}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "Tempo"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    Tempo.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("Tempo00/00")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FineTempo.w=InizioEvento+LunghezzaEvento-1
    XPosizioneTempo.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizioneTempo.b=127-YTopo*127/AreaVisibileDeiValori
    If XPosizioneTempo>=InizioEvento Then StessoEvento | %00001
    If XPosizioneTempo<=FineTempo Then StessoEvento | %00010
    If YPosizioneTempo=Tempo Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new tempo|with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneTempo,YPosizioneTempo}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   Case "BPM"
    YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
    BattutePerMinuto.b=EventoMusicale()\Evento
    LunghezzaEvento.w=Len("BPM000")*8
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato Then LunghezzaEvento+Len("X")*8
    FineBattutePerMinuto.w=InizioEvento+LunghezzaEvento-1
    XPosizioneBattutePerMinuto.w=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    YPosizioneBattutePerMinuto.b=97-YTopo*97/AreaVisibileDeiValori
    If XPosizioneBattutePerMinuto>=InizioEvento Then StessoEvento | %00001
    If XPosizioneBattutePerMinuto<=FineBattutePerMinuto Then StessoEvento | %00010
    If YPosizioneBattutePerMinuto=BattutePerMinuto Then StessoEvento | %00100
    If SequenzaEvento=SequenzaSelezionata Then StessoEvento | %01000
    If StessoEvento=%01111
     If CanaleSelezionato<>CanaleEvento
      If CanaleSelezionato=0
       CanaleSelezionato=CanaleEvento
       Format "00"
       WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
       WColour CanaleSelezionato-1,16-CanaleSelezionato
       Print Str$(CanaleSelezionato)
       Format ""
       StessoEvento | %10000
      Else
       AggiungiEvento=EZRequest("AmySequencer message","Would you add a new BPM|with the current channel?","Yes|No")
       If AggiungiEvento=1
        CanaleEvento=CanaleSelezionato
       Else
        Format "00"
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        If ColoriOriginali=True
         WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
        Else
         WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
        EndIf
        Print Str$(CanaleSelezionato)
        CanaleSelezionato=CanaleEvento
        WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
        WColour CanaleSelezionato-1,16-CanaleSelezionato
        Print Str$(CanaleSelezionato)
        Format ""
        StessoEvento | %10000
       EndIf
      EndIf
     Else
      TipoDiEventoBase$=TipoDiEventoMusicaleSelezionato$
      ImpostaMenuEditoreSequenza{}
      StessoEvento | %10000
     EndIf
     If SelezioneEventoMusicale=#EventoMusicaleSelezionato
      If TastoDelTopoCliccato=#TastoSinistroDelTopoPremuto
       MuoviConIlTopoGliEventiMusicaliSelezionati{XPosizioneBattutePerMinuto,YPosizioneBattutePerMinuto}
      EndIf
      If EventoMusicaleSpostatoConIlTopo=False
       EventiMusicaliSelezionati-1
       EventoMusicale()\Stato & %11111110
      EndIf
     Else
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     EndIf
     EventoMusicaleSelezionato=EventoMusicale()\Evento
     Pop While:Goto FineCicloWhileSelezione
    EndIf
   End Select
  Else
   If EventoMusicale()\Sequenza=SequenzaSelezionata
    If SelezioneEventoMusicale=#EventoMusicaleSelezionato
     Select Modo
     Case #CambiaIlCanaleDegliEventiMusicaliSelezionati
      EventoMusicale()\Canale=CanaleSelezionato
     Case #AlzaDiUnoGliEventiMusicaliSelezionati
      If TipoDiEventoMusicaleSelezionato$="BPM"
       If EventoMusicale()\Evento<97
        EventoMusicale()\Valore+1
        If EventoMusicale()\Valore>2
         EventoMusicale()\Valore=0:EventoMusicale()\Evento+1
        EndIf
       EndIf
      Else
       If EventoMusicale()\Evento<127 Then EventoMusicale()\Evento+1
      EndIf
     Case #AbbassaDiUnoGliEventiMusicaliSelezionati
      If TipoDiEventoMusicaleSelezionato$="BPM"
       If EventoMusicale()\Evento>0
        EventoMusicale()\Valore-1
        If EventoMusicale()\Valore<0
         EventoMusicale()\Valore=2:EventoMusicale()\Evento-1
        EndIf
       Else
        If EventoMusicale()\Valore>1 Then EventoMusicale()\Valore-1
       EndIf
      Else
       If EventoMusicale()\Evento>0 Then EventoMusicale()\Evento-1
      EndIf
     Case #SpostaAvantiNelTempoGliEventiMusicaliSelezionati
      EventoMusicale()\Inizio+LarghezzaEventoBase
     Case #SpostaIndietroNelTempoGliEventiMusicaliSelezionati
      EventoMusicale()\Inizio-LarghezzaEventoBase:If EventoMusicale()\Inizio<0 Then EventoMusicale()\Inizio=0
     Case #EliminaGliEventiMusicaliSelezionati
      EventiMusicaliSelezionati-1
      DurataEventoMusicale.l=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
      KillItem EventoMusicale():EventiMusicali-1
      If EventiMusicali=0 Then DurataSequenza=0
     Case #DeselezionaTuttiGliEventiMusicali
      EventiMusicaliSelezionati-1
      EventoMusicale()\Stato & %11111110
     Case #InvertiLaSelezioneDiTuttiGliEventiMusicali
      EventiMusicaliSelezionati-1
      EventoMusicale()\Stato & %11111110
     End Select
     Select TipoDiEventoMusicaleSelezionato$
     Case "Note"
      Select Modo
      Case #AllungaLaDurataDelleNoteSelezionate
       If EventoMusicale()\Durata=#_MClksPerSP
        EventoMusicale()\Durata=LarghezzaEventoBase
       Else
        EventoMusicale()\Durata+LarghezzaEventoBase
       EndIf
       NotaPiuLunga=Max(NotaPiuLunga,EventoMusicale()\Durata)
       DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
      Case #RiduciLaDurataDelleNoteSelezionate
       EventoMusicale()\Durata-LarghezzaEventoBase
       EventoMusicale()\Durata=Max(EventoMusicale()\Durata,#_MClksPerSP)
       NotaPiuLunga=Max(EventoMusicale()\Durata,NotaPiuLunga)
      Case #AlzaDiUnOttavaLeNoteSelezionate
       EventoMusicale()\Evento+12
       EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
      Case #AbbassaDiUnOttavaLeNoteSelezionate
       EventoMusicale()\Evento-12
       EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
      Case #CambiaIlValoreDegliEventiMusicaliSelezionati
       EventoMusicale()\Valore=ValoreEventoBase
      End Select
     Case "Tempo"
      NuoviBattiti.b=EventoMusicale()\Evento MOD 16+1
      NuoveMisure.b=EventoMusicale()\Evento/16+1
      Select Modo
      Case #AggiungiUnBattitoAlTempoSelezionato
       NuoviBattiti+1
       NuoviBattiti=Min(NuoviBattiti,16)
      Case #TogliUnBattitoAlTempoSelezionato
       NuoviBattiti-1
       NuoviBattiti=Max(NuoviBattiti,1)
      Case #AggiungiUnaMisuraAlTempoSelezionato
       NuoveMisure+1
       NuoveMisure=Min(NuoveMisure,8)
      Case #TogliUnaMisuraAlTempoSelezionato
       NuoveMisure-1
       NuoveMisure=Max(NuoveMisure,1)
      End Select
      EventoMusicale()\Evento=(NuoveMisure-1)*16+NuoviBattiti-1
     Case "BPM"
      Select Modo
      Case #AggiungiDieciAgliEventiMusicaliSelezionati
       If EventoMusicale()\Evento<94
        EventoMusicale()\Evento+3
        EventoMusicale()\Valore+1
        If EventoMusicale()\Valore>2
         EventoMusicale()\Valore=0:EventoMusicale()\Evento+1
        EndIf
       EndIf
      Case #SottraiDieciAgliEventiMusicaliSelezionati
       If EventoMusicale()\Evento>3
        EventoMusicale()\Evento-3:EventoMusicale()\Valore-1
        If EventoMusicale()\Valore<0
         EventoMusicale()\Evento-1:EventoMusicale()\Valore=2
        EndIf
       Else
        If EventoMusicale()\Evento>2 AND EventoMusicale()\Valore>1
         EventoMusicale()\Evento-3:EventoMusicale()\Valore-1
        EndIf
       EndIf
      End Select
     Default
      Select Modo
      Case #AggiungiDieciAgliEventiMusicaliSelezionati
       EventoMusicale()\Evento+10
       EventoMusicale()\Evento=Min(EventoMusicale()\Evento,127)
      Case #SottraiDieciAgliEventiMusicaliSelezionati
       EventoMusicale()\Evento-10
       EventoMusicale()\Evento=Max(EventoMusicale()\Evento,0)
      End Select
     End Select
    Else
     Select Modo
     Case #SelezionaTuttiGliEventiMusicali
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     Case #InvertiLaSelezioneDiTuttiGliEventiMusicali
      EventiMusicaliSelezionati+1
      EventoMusicale()\Stato | #EventoMusicaleSelezionato
     End Select
    EndIf
   EndIf
  EndIf
 Wend
FineCicloWhileSelezione
 If Modo=#SelezionaUnEvento AND StessoEvento<%11111
  If CanaleSelezionato>0
   LastItem EventoMusicale()
   If AddItem(EventoMusicale())=True
    EventiMusicali+1
    EventoMusicale()\Inizio=(XInizioAreaVisibile+(XTopo-16)*ScalaEventiMusicali)/LarghezzaEventoBase*LarghezzaEventoBase
    EventoMusicale()\Canale=CanaleSelezionato
    EventoMusicale()\Sequenza=SequenzaSelezionata
    EventoMusicale()\Stato=0
    EventoMusicale()\Tipo=TipoDiEventoBase$
    Select TipoDiEventoBase$
    Case "Note"
     YTopo=Min(Max(YTopo,0),AltezzaInternaFinestraEditoreSequenza-1-8-8)
     EventoMusicale()\Evento=127-YInizioAreaVisibile-YTopo/8
     EventoMusicale()\Durata=LarghezzaEventoBase
     EventoMusicale()\Valore=ValoreEventoBase
     NotaSuonata\Evento=EventoMusicale()\Evento,0,EventoMusicale()\Canale,EventoMusicale()\Sequenza
     NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
     SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
     NotaSuonata\Stato=True
    Case "Program"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Evento=Min(EventoMusicale()\Evento,98)
     EventoMusicale()\Durata=2
    Case "Control"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
     EventoMusicale()\Valore=ValoreEventoBase
    Case "PolyAftertouch"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
    Case "MonoAftertouch"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
    Case "PitchBend"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
    Case "Tempo"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=127-YTopo*127/AreaVisibileDeiValori
     EventoMusicale()\Durata=2
    Case "BPM"
     YTopo=Min(Max(YTopo,0),AreaVisibileDeiValori)
     EventoMusicale()\Evento=97-YTopo*97/AreaVisibileDeiValori
     If EventoMusicale()\Evento=97 Then EventoMusicale()\Valore=0
     If EventoMusicale()\Evento=0 Then EventoMusicale()\Valore=1
     EventoMusicale()\Durata=2
    End Select
    If TipoDiEventoBase$="PitchBend"
     EventoMusicaleSelezionato=EventoMusicale()\Evento*128+EventoMusicale()\Valore
    Else
     EventoMusicaleSelezionato=EventoMusicale()\Evento
    EndIf
    DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+Max(EventoMusicale()\Durata,LarghezzaEventoBase))
   Else
    EZRequest "AmySequencer message","You have used all the available events","OK"
   EndIf
  Else
   EZRequest "AmySequencer message","You must select a channel first","OK"
  EndIf
 EndIf
 If Modo=#SelezionaGliEventiMusicaliUguali
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If  EventoMusicale()\Canale=CanaleSelezionato AND EventoMusicale()\Sequenza=SequenzaSelezionata
    If EventoMusicale()\Tipo="PitchBend"
     If EventoMusicale()\Evento*128+EventoMusicale()\Valore=EventoMusicaleSelezionato
      If EventoMusicale()\Stato & #EventoMusicaleSelezionato=0
       EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EventiMusicaliSelezionati+1
      EndIf
     EndIf
    Else
     If EventoMusicale()\Evento=EventoMusicaleSelezionato
      If EventoMusicale()\Stato & #EventoMusicaleSelezionato=0
       EventoMusicale()\Stato | #EventoMusicaleSelezionato
       EventiMusicaliSelezionati+1
      EndIf
     EndIf
    EndIf
   EndIf
  Wend
 EndIf
 If NotaPiuLunga>0
  XMessaggio.w=16*16+8*3+8*4+8*6
  YMessaggio.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate XMessaggio,YMessaggio
  WColour 1,0
  Print SPACE$(80-XMessaggio/8)
  WLocate XMessaggio,YMessaggio
  Print "Len>":ConvertiIlTempoInBattute{NotaPiuLunga,Battiti,Misure,True}
 EndIf
 DurataSequenza=0
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())=True
  If EventoMusicale()\Sequenza=SequenzaSelezionata
   DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
  EndIf
 Wend
 LimiteMassimoXInizioAreaVisibile.l=Max(DurataSequenza-(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali,0)
 XInizioAreaVisibile=Min(XInizioAreaVisibile,LimiteMassimoXInizioAreaVisibile)
End Statement

;--------------------------------------------
;questa procedura esegue gli eventi musicali
;this procedure executes the musical events
;-------------------------------------------
Statement EseguiGliEventiMusicali{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED BattutePerMinuto
SHARED DurataSequenza
SHARED EventoMusicale()
SHARED FineMotivo
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoEsc$
SHARED XInizioAreaVisibile
 PushItem Sequenza()
 TicPerCinquantesimoDiSecondo.f=BattutePerMinuto*192*4/3000
 Tempo.l=0
 If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
  FineEsecuzione.l=FineMotivo
 EndIf
 If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
  FineEsecuzione=DurataSequenza
  FineTempoVisibile.l=(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
 EndIf
 Repeat
  EventoEsecutoreEventiMusicaliMusicali.l=Event
  Select EventoEsecutoreEventiMusicali
  Case #HaiChiusoLaFinestra
   Pop Repeat:Goto FineCicloRepeatEsecutore
  Case #HaiPremutoUnTasto
   TastoPremuto$=Inkey$
  End Select
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())
   SequenzaEventoMusicale.l=EventoMusicale()\Sequenza
   If SequenzaEventoMusicale=SequenzaSelezionata OR Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
    If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
     Sequenza.l=0
     ResetList Sequenza()
     While NextItem(Sequenza())=True
      Sequenza+1
      If Sequenza=SequenzaEventoMusicale
       Pop While:Goto FineCicloWhileEsecuzione
      EndIf
     Wend
FineCicloWhileEsecuzione
     InizioEventoMusicale.l=Sequenza()\Inizio+EventoMusicale()\Inizio
    EndIf
    If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
     InizioEventoMusicale=EventoMusicale()\Inizio
    EndIf
    TipoDiEventoMusicale$=EventoMusicale()\Tipo
    DurataEventoMusicale.l=EventoMusicale()\Durata
    FineEventoMusicale.l=InizioEventoMusicale+DurataEventoMusicale-1
    CanaleEventoMusicale.b=EventoMusicale()\Canale
    ValoreEventoMusicale.b=EventoMusicale()\Valore
    EventoMusicaleSuonato.b=EventoMusicale()\Stato & #EventoMusicaleSuonato
    EventoMusicaleTerminato.b=EventoMusicale()\Stato & #EventoMusicaleTerminato
    If EventoMusicaleSuonato=0 AND EventoMusicaleTerminato=0 AND Tempo>=InizioEventoMusicale
     Select TipoDiEventoMusicale$
     Case "Note"
      Nota.b=EventoMusicale()\Evento
      VelocitaNota.b=ValoreEventoMusicale
      SuonaLaNota{Nota,VelocitaNota,CanaleEventoMusicale,Modo}
     Case "Program"
      Programma.b=EventoMusicale()\Evento
      EseguiIlCambioDiProgramma{Programma,CanaleEventoMusicale,Modo}
     Case "Control"
      Controllo.b=EventoMusicale()\Evento
      ValoreConttrollo.b=ValoreEventoMusicale
      EseguiIlCambioDiControllo{Controllo,ValoreControllo,CanaleEventoMusicale,Modo}
     Case "PolyAftertouch"
      PressioneMultipla.b=EventoMusicale()\Evento
      EseguiLaPressioneMultipla{PressionMultipla,CanaleEventoMusicale,Modo}
     Case "MonoAftertouch"
      PressioneSingola.b=EventoMusicale()\Evento
      EseguiLaPressioneSingola{PressioneSingola,CanaleEventoMusicale,Modo}
     Case "PitchBend"
      CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
      EseguiLaCurvaDiPicco{CurvaDiPicco,CanaleEventoMusicale,Modo}
     Case "Tempo"
      NuovoTempo.b=EventoMusicale()\Evento
      MostraIlTempo{NuovoTempo,CanaleEventoMusicale,Modo}
     Case "BPM"
      NuoveBattutePerMinuto.w=9+EventoMusicale()\Evento*3+EventoMusicale()\Valore
      TicPerCinquantesimoDiSecondo=NuoveBattutePerMinuto*192*4/3000
      MostraLeBattutePerMinuto{NuoveBattutePerMinuto,CanaleEventoMusicale,Modo}
     End Select
     If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
      Evento.b=EventoMusicale()\Evento
      InizioEvento.l=InizioEventoMusicale
      DurataEvento.l=DurataEventoMusicale
      CanaleEvento.b=CanaleEventoMusicale
      ValoreEvento.b=ValoreEventoMusicale
      If TipoDiEventoMusicale$="PitchBend"
       CurvaDiPicco.w=Evento*128+ValoreEvento
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleSuonato}
      Else
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleSuonato}
      EndIf
     EndIf
     EventoMusicale()\Stato | #EventoMusicaleSuonato
    EndIf
    If EventoMusicaleSuonato=#EventoMusicaleSuonato AND EventoMusicaleTerminato=0 AND Tempo>=FineEventoMusicale
     If TipoDiEventoMusicale$="Note"
      Nota=EventoMusicale()\Evento
      VelocitaNota=EventoMusicale()\Valore
      SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleEventoMusicale,Modo}
     EndIf
     If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
      Evento=EventoMusicale()\Evento
      InizioEvento=InizioEventoMusicale
      DurataEvento=DurataEventoMusicale
      CanaleEvento=CanaleEventoMusicale
      ValoreEvento=EventoMusicale()\Valore
      StatoOriginaleEvento.b=EventoMusicale()\Stato & %11110111
      If TipoDiEventoMusicale$="PitchBend"
       CurvaDiPicco.w=Evento*128+ValoreEvento
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
      Else
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,StatoOriginaleEvento}
      EndIf
     EndIf
     EventoMusicale()\Stato | #EventoMusicaleTerminato
    EndIf
   EndIf
  Wend
  VWait
  Tempo+TicPerCinquantesimoDiSecondo
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   If Tempo-XInizioAreaVisibile>FineTempoVisibile
    XInizioAreaVisibile=Tempo
    MostraLeNoteDiSfondoConILoroNomi{}
    MostraLeBattute{}
    MostraGliEventiMusicali{}
    MostraSliderEditoreSequenza{}
   EndIf
  EndIf
 Until Tempo>=FineEsecuzione OR TastoPremuto$=TastoEsc$ OR TastoPremuto$=" "
FineCicloRepeatEsecutore
 ResetList EventoMusicale()
 While NextItem(EventoMusicale())
  EventoMusicaleSuonato.b=EventoMusicale()\Stato & #EventoMusicaleSuonato
  If EventoMusicale()\Tipo="Note" AND EventoMusicaleSuonato=#EventoMusicaleSuonato
   Nota=EventoMusicale()\Evento
   VelocitaNota=EventoMusicale()\Valore
   CanaleNota.b=EventoMusicale()\Canale
   SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,Modo}
  EndIf
  EventoMusicale()\Stato & %11100111
 Wend
 PopItem Sequenza()
 Quiet %1111
End Statement

;-------------------------------------------------------------------------
;questa procedura gestisce il titolo della finestra dell'editore sequenza
;this procedure handles the sequence editor window title
;--------------------------------------------------------
Statement MostraTitoloFinestraEditoreSequenza{}
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED Sequenza
SHARED Sequenza()
SHARED SequenzaSelezionata
 TitoloFinestra$="Sequence "+Str$(SequenzaSelezionata)+":"
 NomeSequenza$=Sequenza()\Nome
 If NomeSequenza$="" Then NomeSequenza$="unnamed"
 TitoloFinestra$+NomeSequenza$+"-"
 If EventiMusicali>0
  TitoloFinestra$+Str$(EventiMusicaliSelezionati)+" selected event"
  If EventiMusicaliSelezionati<>1 Then TitoloFinestra$+"s"
  TitoloFinestra$+" of "+Str$(EventiMusicali)+" event"
  If EventiMusicali<>1 Then TitoloFinestra$+"s"
 Else
  TitoloFinestra$+"no events into this sequence"
 EndIf
 WTitle TitoloFinestra$
End Statement

;converts the given value if over 127 into the negative equivalent
Function.b ConvertiOltreCentoventisetteInNegativo{Dato.w}
 If Dato>127 Then Dato-256
 DatoConvertito.b=Dato
 Function Return DatoConvertito
End Function

;----------------------------------------------
;questa procedura registra gli eventi musicali
;this procedure records the musical events
;------------------------------------------
Statement RegistraGliEventiMusicali{Modo.b}
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED Battiti
SHARED BattutePerMinuto
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED Misure
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TastoCursoreGiu$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED XInizioAreaVisibile
 If SequenzaSelezionata>0
  Messaggio$="Begin recording?|If you'll choose|OK use CURSOR KEYS|UP & DOWN to change|BPM and press SPACE|to end recording"
  Registrazione.b=EZRequest("AmySequencer message",Messaggio$,"OK|Cancel")
  If Registrazione=0 Then Statement Return
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   FineTempoVisibile.l=(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
  EndIf
  Battito.b=Misure
  TicPerCinquantesimoDiSecondo.f=BattutePerMinuto*192*4/3000
  Tempo.l=0
  Repeat
   EventoRegistratoreEventiMusicali.l=Event
   Select EventoRegistratoreEventiMusicali
   Case #HaiChiusoLaFinestra
    Pop Repeat:Statement Return
   Case #HaiPremutoUnTasto
    TastoPremuto$=Inkey$
    Select TastoPremuto$
    Case TastoCursoreSu$
     If BattutePerMinuto<300
      BattutePerMinuto+1
      TicPerCinquantesimoDiSecondo=BattutePerMinuto*192*4/3000
      MostraLeBattutePerMinuto{BattutePerMinuto,10,Modo}
     EndIf
    Case TastoCursoreGiu$
     If BattutePerMinuto>10
      BattutePerMinuto-1
      TicPerCinquantesimoDiSecondo=BattutePerMinuto*192*4/3000
      MostraLeBattutePerMinuto{BattutePerMinuto,10,Modo}
     EndIf
    End Select
   End Select
   ByteDiStato.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   TipoDiEventoMusicale.b=ByteDiStato & #_StatusBits
   CanaleEvento.b=ConvertiOltreCentoventisetteInNegativo{ByteDiStato & #_ChannelBits}+1
   Select TipoDiEventoMusicale
   Case #_NoteOn
    TipoDiEventoMusicale$="Note"
    Evento.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    ValoreEvento.b=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_NoteOff
    TipoDiEventoMusicale$="NoteOff"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_ProgramChange
    TipoDiEventoMusicale$="Program"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_ControlChange
    TipoDiEventoMusicale$="Control"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_PolyphonicKeyPressure
    TipoDiEventoMusicale$="PolyAftertouch"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_ChannelKeyPressure
    TipoDiEventoMusicale$="MonoAftertouch"
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Case #_PitchBend
    TipoDiEventoMusicale$="PitchBend"
    ValoreEvento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
    Evento=ConvertiOltreCentoventisetteInNegativo{ReadSerial(0)}
   Default
    TipoDiEventoMusicale$=""
   End Select
   If TipoDiEventoMusicale$<>""
    If TipoDiEventoMusicale$<>"NoteOff"
     LastItem EventoMusicale()
     If AddItem(EventoMusicale())=True
      EventoMusicale()\Tipo=TipoDiEventoMusicale$
      EventoMusicale()\Evento=Evento
      EventoMusicale()\Inizio=Tempo
      EventoMusicale()\Canale=CanaleEvento
      EventoMusicale()\Sequenza=SequenzaSelezionata
      EventoMusicale()\Durata=2
      If TipoDiEventoMusicale$="Note" Then EventoMusicale()\Valore=ValoreEvento
      If TipoDiEventoMusicale$="Control" Then EventoMusicale()\Valore=ValoreEvento
      If TipoDiEventoMusicale$="PitchBend" Then EventoMusicale()\Valore=ValoreEvento
      Select TipoDiEventoMusicale$
      Case "Note"
       Nota.b=EventoMusicale()\Evento
       SuonaLaNota{Nota,ValoreEvento,CanaleEvento,Modo}
      Case "Program"
       Programma.b=EventoMusicale()\Evento
       EseguiIlCambioDiProgramma{Programma,CanaleEvento,Modo}
      Case "Control"
       Controllo.b=EventoMusicale()\Evento:ValoreEvento=EventoMusicale()\Valore
       EseguiIlCambioDiControllo{Controllo,ValoreEvento,CanaleEvento,Modo}
      Case "PolyAftertouch"
       PressioneMultipla.b=EventoMusicale()\Evento
       EseguiLaPressioneMultipla{PressioneMultipla,CanaleEvento,Modo}
      Case "MonoAftertouch"
       PressioneSingola.b=EventoMusicale()\Evento
       EseguiLaPressioneSingola{PressioneSingola,CanaleEvento,Modo}
      Case "PitchBend"
       CurvaDiPicco.w=EventoMusicale()\Evento*128+EventoMusicale()\Valore
       EseguiLaCurvaDiPicco{CurvaDiPicco,CanaleEvento,Modo}
      End Select
      EventoMusicale()\Stato | #EventoMusicaleSuonato
      If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
      Sequenza()\EventiMusicali+1
      EndIf
      If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
       EventiMusicali+1:MostraTitoloFinestraEditoreSequenza{}
      EndIf
     Else
      EZRequest "AmySequencer message","You have used all the available events","OK"
      Statement Return
     EndIf
    Else
     SmettiDiSuonareLaNota{Evento,ValoreEvento,CanaleEvento,Modo}
     EventoMusicale()\Stato & %11110111
     EventoMusicale()\Stato | #EventoMusicaleTerminato
    EndIf
   EndIf
   VWait
   Tempo+TicPerCinquantesimoDiSecondo
   If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
    Sequenza()\Durata=Tempo-Sequenza()\Inizio+1
   EndIf
   If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
    If Tempo-XInizioAreaVisibile>FineTempoVisibile
     XInizioAreaVisibile=Tempo
     MostraLeNoteDiSfondoConILoroNomi{}
     MostraLeBattute{}
     MostraSliderEditoreSequenza{}
    EndIf
    Sequenza()\Durata=Tempo+1
    DurataSequenza=Tempo+1
   EndIf
   TempoMetronomo.w+TicPerCinquantesimoDiSecondo
   If TempoMetronomo>=(192.0*Battiti)/Misure
    If NotaMetronomoSuonata.b=True
     SmettiDiSuonareLaNota{76,0,10,Modo}
     TempoMetronomo=0
     NotaMetronomoSuonata=False
    Else
     SuonaLaNota{76,(127.0*Battito)/Misure,10,Modo}
     Battito-1:If Battito=0 Then Battito=Misure
     NotaMetronomoSuonata=True
    EndIf
   EndIf
   ResetList EventoMusicale()
   While NextItem(EventoMusicale())=True
    TipoDiEventoMusicale$=EventoMusicale()\Tipo
    Evento=EventoMusicale()\Evento
    InizioEvento.l=EventoMusicale()\Inizio
    DurataEvento.l=EventoMusicale()\Durata
    CanaleEvento=EventoMusicale()\Canale
    ValoreEvento=EventoMusicale()\Valore
    StatoEvento.b=EventoMusicale()\Stato
    EventoMusicaleSuonato.b=StatoEvento & #EventoMusicaleSuonato
    If EventoMusicaleSuonato=#EventoMusicaleSuonato
     If TipoDiEventoMusicale$="Note" Then EventoMusicale()\Durata=Tempo-InizioEvento+1
     If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
      If TipoDiEventoMusicale$="PitchBend"
       CurvaDiPicco.w=Evento*128+ValoreEvento
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleSuonato}
      Else
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,#EventoMusicaleSuonato}
      EndIf
     EndIf
     If InizioEvento+DurataEvento-1>=Tempo
      EventoMusicale()\Stato & %11110111
      EventoMusicale()\Stato | #EventoMusicaleTerminato
     EndIf
    EndIf
    EventoMusicaleTerminato.b=StatoEvento & #EventoMusicaleTerminato
    If EventoMusicaleTerminato=#EventoMusicaleTerminato
     If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
      If TipoDiEventoMusicale$="PitchBend"
       CurvaDiPicco=Evento*128+ValoreEvento
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,CurvaDiPicco,InizioEvento,DurataEvento,CanaleEvento,StatoEvento}
      Else
       DisegnaUnEventoMusicale{TipoDiEventoMusicale$,Evento,InizioEvento,DurataEvento,CanaleEvento,StatoEvento}
      EndIf
     EndIf
     EventoMusicale()\Stato & %11101111
    EndIf
   Wend
  Until TastoPremuto$=TastoEsc$ OR TastoPremuto$=" "
  If Modo=#EseguiGliEventiMusicaliDallaFinestraPrincipale
   Sequenza()\Durata=Tempo-Sequenza()\Inizio+1
  EndIf
  If Modo=#EseguiGliEventiMusicaliDallEditoreSequenza
   DurataSequenza=Tempo+1
  EndIf
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   EventoMusicale()\Stato & %11100111
  Wend
 Else
  EZRequest "AmySequencer message","You must select a sequence first","OK"
 EndIf
End Statement

Statement AggiungiUnaNotaDallaTastiera{Nota$}
SHARED AreaInvisibileDelleNote
SHARED CanaleSelezionato
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventoMusicale()
SHARED LarghezzaEventoBase
SHARED NotaSuonata
SHARED OttavaSelezionata
SHARED PuntoDiInserimento
SHARED ScalaEventiMusicali
SHARED SequenzaSelezionata
SHARED ValoreEventoBase
 Select Nota$
 Case "C1"
  Nota.b=0
 Case "C#1"
  Nota=1
 Case "D1"
  Nota=2
 Case "D#1"
  Nota=3
 Case "E1"
  Nota=4
 Case "F1"
  Nota=5
 Case "F#1"
  Nota=6
 Case "G1"
  Nota=7
 Case "G#1"
  Nota=8
 Case "A1"
  Nota=9
 Case "A#1"
  Nota=10
 Case "B1"
  Nota=11
 Case "C2"
  Nota=12
 Case "C#2"
  Nota=13
 Case "D2"
  Nota=14
 Case "D#2"
  Nota=15
 Case "E2"
  Nota=16
 Case "F2"
  Nota=17
 Case "F#2"
  Nota=18
 Case "G2"
  Nota=19
 Case "G#2"
  Nota=20
 Case "A2"
  Nota=21
 Case "A#2"
  Nota=22
 Case "B2"
  Nota=23
 End Select
 Nota+OttavaSelezionata*12:Nota=Min(Nota,127)
 If CanaleSelezionato>0
  LastItem EventoMusicale()
  If AddItem(EventoMusicale())=True
   EventiMusicali+1
   EventoMusicale()\Tipo="Note"
   EventoMusicale()\Evento=Nota
   EventoMusicale()\Inizio=PuntoDiInserimento
   EventoMusicale()\Canale=CanaleSelezionato
   EventoMusicale()\Sequenza=SequenzaSelezionata
   EventoMusicale()\Stato=#EventoMusicaleNonSelezionato
   EventoMusicale()\Durata=LarghezzaEventoBase
   EventoMusicale()\Valore=ValoreEventoBase
   If NotaSuonata\Stato=True
    Nota.b=NotaSuonata\Evento
    VelocitaNota.b=NotaSuonata\Valore
    CanaleNota.b=NotaSuonata\Canale
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiMusicaliDallEditoreSequenza}
   EndIf
   NotaSuonata\Evento=EventoMusicale()\Evento,EventoMusicale()\Inizio,EventoMusicale()\Canale,EventoMusicale()\Sequenza
   NotaSuonata\Durata=EventoMusicale()\Durata,EventoMusicale()\Valore
   SuonaLaNota{NotaSuonata\Evento,NotaSuonata\Valore,NotaSuonata\Canale,#EseguiGliEventiMusicaliDallEditoreSequenza}
   NotaSuonata\Stato=True
   PuntoDiInserimento+LarghezzaEventoBase
   DurataSequenza=Max(DurataSequenza,EventoMusicale()\Inizio+EventoMusicale()\Durata)
  Else
   EZRequest "AmySequencer message","You have used all the available events","OK"
  EndIf
 Else
  EZRequest "AmySequencer message","You must select a channel first","OK"
 EndIf
End Statement

;-------------------------------------------------------------
;questa procedura permette di editare la sequenza selezionata
;this procedure permits to edit the selected sequence
;-----------------------------------------------------
Statement EditoreSequenza{}
SHARED AltezzaFonte
SHARED AltezzaInternaFinestraEditoreSequenza
SHARED AltezzaSchermo
SHARED AreaInvisibileDelleNote
SHARED AreaInvisibileDelTempo
SHARED AreaVisibileDeiValori
SHARED Battiti
SHARED CanaleSelezionato
SHARED ColoriOriginali
SHARED DurataSequenza
SHARED EventiMusicali
SHARED EventiMusicaliSelezionati
SHARED EventoMusicale()
SHARED LarghezzaInternaFinestraEditoreSequenza
SHARED LarghezzaEventoBase
SHARED LarghezzaSchermo
SHARED MIDIAttivato
SHARED Misure
SHARED MostraEventiMusicaliDelloStessoTipoDaSoli
SHARED MostraNuovoValore
SHARED NotaSuonata
SHARED NoteSuonate
SHARED OttavaSelezionata
SHARED PeriFreq()
SHARED PrimaVoltaNellEditoreSequenza
SHARED PuntoDiInserimento
SHARED ScalaEventiMusicali
SHARED Sequenza()
SHARED TastoDelTopoCliccato
SHARED TastoBackspace$
SHARED TastoCursoreDestra$
SHARED TastoCursoreGiu$
SHARED TastoCursoreSinistra$
SHARED TastoCursoreSu$
SHARED TastoEsc$
SHARED TicPerCinquantesimoDiSecondo
SHARED TipoDiEventoBase$
SHARED TipoDiNota()
SHARED XInizioAreaVisibile
SHARED XLunSlider
SHARED XTopo
SHARED YInizioAreaVisibile
SHARED YLunSlider
SHARED YTopo

;-----------------------------------------------------------------------
;imposta il colore del testo nei menu' a quello piu' chiaro disponibile
;sets text menu colour to the brightest available
;-------------------------------------------------
 MenuColour 3

 XPosF.w=0:YPosF.w=AltezzaFonte+3:XLunF.w=LarghezzaSchermo:YLunF.w=AltezzaSchermo-(AltezzaFonte+3)
 TipoFinestra.l=#GadgetNascondiFinestra+#GadgetChiudiFinestra+#FinestraConMemoriaSfondo+#FinestraAttivata
 DurataSequenza=Max(Sequenza()\Durata,192*4.0/Misure*Battiti)
 EventiMusicali=Sequenza()\EventiMusicali
 EventiMusicaliSelezionati=Sequenza()\EventiMusicaliSelezionati
 Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1
 MostraTitoloFinestraEditoreSequenza{}
 LarghezzaInternaFinestraEditoreSequenza=InnerWidth
 AltezzaInternaFinestraEditoreSequenza=InnerHeight
 CloseWindow #FinestraEditoreSequenza

 AreaInvisibileDelleNote.b=128-(AltezzaInternaFinestraEditoreSequenza-8-8)/8

 AreaVisibileDeiValori.w=(128-AreaInvisibileDelleNote)*8-1-7

 XLunSlider=16
 YLunSlider=AltezzaInternaFinestraEditoreSequenza-8-8
 ImpostaSlider{1,0,0,"VERTICAL",0,#ListaGadgetEditoreSequenza}

 XLunSlider=LarghezzaInternaFinestraEditoreSequenza-16
 YLunSlider=8
 ImpostaSlider{2,16,AltezzaInternaFinestraEditoreSequenza-8-8,"HORIZONTAL",0,#ListaGadgetEditoreSequenza}

 Window #FinestraEditoreSequenza,XPosF,YPosF,XLunF,YLunF,TipoFinestra,"",-1,-1,#ListaGadgetEditoreSequenza
 MostraTitoloFinestraEditoreSequenza{}

;----------------------------------------------
;imposta la fonte di caratteri per la finestra
;sets the font for the window
;-----------------------------
 WindowFont #FonteDiCaratteriTopaz8

 WJam #DueColoriConSfondoPieno

 SetZone 0,0,0,LarghezzaInternaFinestraEditoreSequenza-1,AltezzaInternaFinestraEditoreSequenza-1-8-8
 Format "00"
 For Canale.b=1 To 16
  X0Canale.w=(Canale-1)*16:Y0Canale.w=AltezzaInternaFinestraEditoreSequenza-8
  WLocate X0Canale,Y0Canale
  If Canale=CanaleSelezionato
   WColour Canale-1,16-Canale
  Else
   If ColoriOriginali=True
    WColour Canale MOD 2+1,Canale MOD 2
   Else
    WColour 10+(Canale MOD 2)*2,9+(Canale MOD 2)*2
   EndIf
  EndIf
  Print Canale
  SetZone Canale,X0Canale,Y0Canale,X0Canale+15,Y0Canale+7
 Next Canale
 Format ""
 WLocate X0Canale+16,Y0Canale
 If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
 Print "All":SetZone 17,X0Canale+16,Y0Canale,X0Canale+16+23,Y0Canale+7
 WLocate X0Canale+16+8*3,Y0Canale
 If ColoriOriginali=True Then WColour 1,0 Else WColour 15,14
 Print "None":SetZone 18,X0Canale+16+8*3,Y0Canale,X0Canale+16+8*3+8*4-1,Y0Canale+7
 WLocate X0Canale+16+8*3+8*4,Y0Canale
 If ColoriOriginali=True Then WColour 2,1 Else WColour 14,13
 Print "Toggle":SetZone 19,X0Canale+16+8*3+8*4,Y0Canale,X0Canale+16+8*3+8*4+8*6-1,Y0Canale+7
 MostraLaScalaDegliEventiMusicali{False}
 SetZone 20,0,AltezzaInternaFinestraEditoreSequenza-8-8,7,AltezzaInternaFinestraEditoreSequenza-8-8+7
 SetZone 21,8,AltezzaInternaFinestraEditoreSequenza-8-8,15,AltezzaInternaFinestraEditoreSequenza-8-8+7
 If PrimaVoltaNellEditoreSequenza=True

;------------------------------------------------------------------
;questa variabile indica l'inizio delle note nell'editore sequenza
;this variable states the note beginning in the sequence editor
;---------------------------------------------------------------
  YInizioAreaVisibile=127-(127-AreaInvisibileDelleNote)-#_MiddleC
 EndIf
 Repeat
  If SecondoClicDelTopo.b=False
   AreaInvisibileDelTempo=DurataSequenza-(LarghezzaInternaFinestraEditoreSequenza-16)*ScalaEventiMusicali
   AreaInvisibileDelTempo=Max(AreaInvisibileDelTempo,0)
   ImpostaMenuEditoreSequenza{}
   MostraTitoloFinestraEditoreSequenza{}
   MostraLeNoteDiSfondoConILoroNomi{}
   MostraLeBattute{}
   MostraGliEventiMusicali{}
   MostraIlPuntoDiInserimento{}
   MostraSliderEditoreSequenza{}
   SecondoClicDelTopo=True
  EndIf
  If PrimaVoltaNellEditoreSequenza=True
   MostraITastiDaUsare{}
   MostraLaMappaturaDelleNoteSullaTastiera{}
   PrimaVoltaNellEditoreSequenza=False
  EndIf
  If NotaSuonata\Stato=True
   Nota.b=NotaSuonata\Evento:FineNota.l=NotaSuonata\Durata-1
   VelocitaNota.b=NotaSuonata\Valore:CanaleNota.b=NotaSuonata\Canale
   DurataNota.l=(Timer-TempoTrascorso.l)*TicPerCinquantesimoDiSecondo
   If DurataNota>FineNota
    SmettiDiSuonareLaNota{Nota,VelocitaNota,CanaleNota,#EseguiGliEventiMusicaliDallEditoreSequenza}
    NotaSuonata\Stato=False
   EndIf
  EndIf
  If NoteSuonate>0 AND NotaSuonata\Stato=False
   If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)+" notes"
   Messaggio$+" still playing:|clicking on OK you will stop "
   If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
   EZRequest "AmySequencer message",Messaggio$,"OK"
   InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallEditoreSequenza}
   NoteSuonate=0
  EndIf
  EventoFinestraEditoreSequenza.l=Event
  Select EventoFinestraEditoreSequenza
  Case #HaiPremutoUnTastoDelTopo
   XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato=MButtons
   ZonaTopo.b=Zone(XTopo,YTopo)
   Select TastoDelTopoCliccato
   Case #TastoSinistroDelTopoPremuto
    Select ZonaTopo
    Case 0
     Selezione{#SelezionaUnEvento}
    Case 1
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=1:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 2
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=2:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 3
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=3:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 4
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=4:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato:Print Str$(CanaleSelezionato)
     Format ""
    Case 5
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=5:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 6
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=6:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 7
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=7:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 8
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=8:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 9
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=9:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 10
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=10:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 11
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=11:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 12
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=12:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 13
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=13:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 14
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=14:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 15
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=15:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 16
     Format "00"
     If CanaleSelezionato>0
      WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
      If ColoriOriginali=True
       WColour CanaleSelezionato MOD 2+1,CanaleSelezionato MOD 2
      Else
       WColour 10+(CanaleSelezionato MOD 2)*2,9+(CanaleSelezionato MOD 2)*2
      EndIf
      Print Str$(CanaleSelezionato)
     EndIf
     CanaleSelezionato=16:Selezione{#CambiaIlCanaleDegliEventiMusicaliSelezionati}
     WLocate (CanaleSelezionato-1)*16,AltezzaInternaFinestraEditoreSequenza-8
     WColour CanaleSelezionato-1,16-CanaleSelezionato
     Print Str$(CanaleSelezionato)
     Format ""
    Case 17
     Selezione{#SelezionaTuttiGliEventiMusicali}
    Case 18
     Selezione{#DeselezionaTuttiGliEventiMusicali}
    Case 19
     Selezione{#InvertiLaSelezioneDiTuttiGliEventiMusicali}
    Case 20
     ScalaEventiMusicali/2:If ScalaEventiMusicali=0 Then ScalaEventiMusicali=64
     MostraLaScalaDegliEventiMusicali{True}
    Case 21
     ScalaEventiMusicali+ScalaEventiMusicali:If ScalaEventiMusicali=128 Then ScalaEventiMusicali=1
     MostraLaScalaDegliEventiMusicali{True}
    End Select
    TempoTrascorso.l=Timer
    SecondoClicDelTopo=False
   Case #TastoSinistroDelTopoRilasciato
    If Timer-TempoTrascorso>49 AND ZonaTopo=0
     Selezione{#SelezionaGliEventiMusicaliUguali}
     SecondoClicDelTopo=False
    Else
     SecondoClicDelTopo=True
    EndIf
   End Select
;  Case #HaiPremutoUnGadget
;   Select GadgetHit
;   Case 1
;    AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
;    YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
;   Case 2
;    LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
;    XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
;    XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
;   End Select
  Case #HaiRilasciatoUnGadget
   Select GadgetHit
   Case 1
    AltezzaSlider.w=AltezzaInternaFinestraEditoreSequenza-8-8
    YInizioAreaVisibile=ValoreSlider{1,AreaInvisibileDelleNote,AltezzaSlider,"VERTICAL",#ListaGadgetEditoreSequenza}
   Case 2
    LunghezzaSlider.w=LarghezzaInternaFinestraEditoreSequenza-16
    XInizioAreaVisibile=ValoreSlider{2,AreaInvisibileDelTempo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetEditoreSequenza}
    XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
   End Select
   SecondoClicDelTopo=False
  Case #HaiAttivatoIlMenu
   If MenuHit=0 AND ItemHit=0 Then EseguiGliEventiMusicali{#EseguiGliEventiMusicaliDallEditoreSequenza}
   If MenuHit=0 AND ItemHit=1 Then RegistraGliEventiMusicali{#EseguiGliEventiMusicaliDallEditoreSequenza}

   If MenuHit=1 AND ItemHit=0 Then TipoDiEventoBase$="Note"
   If MenuHit=1 AND ItemHit=1 Then TipoDiEventoBase$="Program"
   If MenuHit=1 AND ItemHit=2 Then TipoDiEventoBase$="Control"
   If MenuHit=1 AND ItemHit=3 Then TipoDiEventoBase$="PolyAftertouch"
   If MenuHit=1 AND ItemHit=4 Then TipoDiEventoBase$="MonoAftertouch"
   If MenuHit=1 AND ItemHit=5 Then TipoDiEventoBase$="PitchBend"
   If MenuHit=1 AND ItemHit=6 Then TipoDiEventoBase$="Tempo"
   If MenuHit=1 AND ItemHit=7 Then TipoDiEventoBase$="BPM"
   If MenuHit=1 AND ItemHit=8 Then MostraEventiMusicaliDelloStessoTipoDaSoli=NOT MostraEventiMusicaliDelloStessoTipoDaSoli

   If MenuHit=2 AND ItemHit=0 Then CambiaLEventoBase{}
   If MenuHit=2 AND ItemHit=1 Then MostraNuovoValoreEvento=NOT MostraNuovoValore

   If MenuHit=3 AND ItemHit=0 Then MostraITastiDaUsare{}
   If MenuHit=3 AND ItemHit=1 Then MostraLaMappaturaDelleNoteSullaTastiera{}

   SecondoClicDelTopo=False
  Case #HaiChiusoLaFinestra
   EsciDallEditoreSequenza.b=True
  Case #HaiPremutoUnTasto
   TastoPremuto$=LCase$(Inkey$):TastoRiga.w=RawKey
   If TastoPremuto$=TastoEsc$ Then EsciDallEditoreSequenza=True
   Select TastoRiga
   Case 2
    Nota$="C#2"
   Case 3
    Nota$="D#2"
   Case 5
    Nota$="F#2"
   Case 6
    Nota$="G#2"
   Case 7
    Nota$="A#2"
   Case 16
    Nota$="C2"
   Case 17
    Nota$="D2"
   Case 18
    Nota$="E2"
   Case 19
    Nota$="F2"
   Case 20
    Nota$="G2"
   Case 21
    Nota$="A2"
   Case 22
    Nota$="B2"
   Case 33
    Nota$="C#1"
   Case 34
    Nota$="D#1"
   Case 36
    Nota$="F#1"
   Case 37
    Nota$="G#1"
   Case 38
    Nota$="A#1"
   Case 49
    Nota$="C1"
   Case 50
    Nota$="D1"
   Case 51
    Nota$="E1"
   Case 52
    Nota$="F1"
   Case 53
    Nota$="G1"
   Case 54
    Nota$="A1"
   Case 55
    Nota$="B1"
   Case 80
    OttavaSelezionata=0
   Case 81
    OttavaSelezionata=1
   Case 82
    OttavaSelezionata=2
   Case 83
    OttavaSelezionata=3
   Case 84
    OttavaSelezionata=4
   Case 85
    OttavaSelezionata=5
   Case 86
    OttavaSelezionata=6
   Case 87
    OttavaSelezionata=7
   Case 88
    OttavaSelezionata=8
   Case 89
    OttavaSelezionata=9
   Default
    TastoRiga=0
   End Select
   If TastoRiga>0
    If TastoRiga<80
     AggiungiUnaNotaDallaTastiera{Nota$}
    Else
     YInizioAreaVisibile=Max(127-(127-AreaInvisibileDelleNote)-OttavaSelezionata*12,0)
    EndIf
   EndIf
   TastiShiftPremuti.b=(Qualifier-$8000) & %11
   If EventiMusicaliSelezionati>0
    If TastiShiftPremuti>0
     Select TastoPremuto$
     Case TastoBackspace$
      Selezione{#EliminaGliEventiMusicaliSelezionati}
     Case TastoCursoreSu$
      If TipoDiEventoBase$="Note" Then Selezione{#AlzaDiUnOttavaLeNoteSelezionate}
      If TipoDiEventoBase$="Program" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="Control" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="PolyAftertouch" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="MonoAftertouch" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="Tempo" Then Selezione{#AggiungiUnaMisuraAlTempoSelezionato}
      If TipoDiEventoBase$="BPM" Then Selezione{#AggiungiDieciAgliEventiMusicaliSelezionati}
     Case TastoCursoreGiu$
      If TipoDiEventoBase$="Note" Then Selezione{#AbbassaDiUnOttavaLeNoteSelezionate}
      If TipoDiEventoBase$="Program" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="Control" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="PolyAftertouch" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="MonoAftertouch" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
      If TipoDiEventoBase$="Tempo" Then Selezione{#TogliUnaMisuraAlTempoSelezionato}
      If TipoDiEventoBase$="BPM" Then Selezione{#SottraiDieciAgliEventiMusicaliSelezionati}
     Case TastoCursoreDestra$
      If TipoDiEventoBase$="Note" Then Selezione{#AllungaLaDurataDelleNoteSelezionate}
     Case TastoCursoreSinistra$
      If TipoDiEventoBase$="Note" Then Selezione{#RiduciLaDurataDelleNoteSelezionate}
     End Select
    Else
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
       DurataEventoMusicale.l=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
       DurataSequenza-DurataEventoMusicale
       XInizioAreaVisibile-DurataEventoMusicale
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():EventiMusicali-1
      EndIf
     Case TastoCursoreSu$
      If TipoDiEventoBase$="Tempo"
       Selezione{#AggiungiUnBattitoAlTempoSelezionato}
      Else
       Selezione{#AlzaDiUnoGliEventiMusicaliSelezionati}
      EndIf
     Case TastoCursoreGiu$
      If TipoDiEventoBase$="Tempo"
       Selezione{#TogliUnBattitoAlTempoSelezionato}
      Else
       Selezione{#AbbassaDiUnoGliEventiMusicaliSelezionati}
      EndIf
     Case TastoCursoreDestra$
      Selezione{#SpostaAvantiNelTempoGliEventiMusicaliSelezionati}
     Case TastoCursoreSinistra$
      Selezione{#SpostaIndietroNelTempoGliEventiMusicaliSelezionati}
     End Select
    EndIf
   Else
    If TastiShiftPremuti>0
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
       DurataEventoMusicale=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
       DurataSequenza-DurataEventoMusicale
       XInizioAreaVisibile-DurataEventoMusicale
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():EventiMusicali-1
      EndIf
     Case TastoCursoreDestra$
      PuntoDiInserimento+LarghezzaEventoBase
      PuntoDiInserimento=Min(PuntoDiInserimento,DurataSequenza)
     Case TastoCursoreSinistra$
      PuntoDiInserimento-LarghezzaEventoBase
      PuntoDiInserimento=Max(PuntoDiInserimento,0)
     End Select
    Else
     Select TastoPremuto$
     Case TastoBackspace$
      If LastItem(EventoMusicale())=True
       If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato Then EventiMusicaliSelezionati-1
       DurataEventoMusicale=Max(EventoMusicale()\Durata,LarghezzaEventoBase)
       DurataSequenza-DurataEventoMusicale
       XInizioAreaVisibile-DurataEventoMusicale
       XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
       KillItem EventoMusicale():EventiMusicali-1
      EndIf
     Case TastoCursoreSu$
      If YInizioAreaVisibile>0 Then YInizioAreaVisibile-1
     Case TastoCursoreGiu$
      If YInizioAreaVisibile<AreaInvisibileDelleNote Then YInizioAreaVisibile+1
     Case TastoCursoreDestra$
      XInizioAreaVisibile+LarghezzaEventoBase
      XInizioAreaVisibile=Min(XInizioAreaVisibile,AreaInvisibileDelTempo)
     Case TastoCursoreSinistra$
      XInizioAreaVisibile-LarghezzaEventoBase
      XInizioAreaVisibile=Max(XInizioAreaVisibile,0)
     End Select
    EndIf
   EndIf
   If TastoPremuto$=" "
    ResetList EventoMusicale()
    While NextItem(EventoMusicale())
     If EventoMusicale()\Inizio>=PuntoDiInserimento
      EventoMusicale()\Inizio+LarghezzaEventoBase
     EndIf
    Wend
    PuntoDiInserimento+LarghezzaEventoBase
    DurataSequenza+LarghezzaEventoBase
   EndIf
   SecondoClicDelTopo=False
  End Select
 Until EsciDallEditoreSequenza=True
 Sequenza()\EventiMusicali=EventiMusicali
 Sequenza()\EventiMusicaliSelezionati=EventiMusicaliSelezionati
 Sequenza()\Durata=DurataSequenza
 CloseWindow #FinestraEditoreSequenza
 Use Window #FinestraPrincipale
 WJam #UnColoreConSfondoTrasparente
End Statement

;------------------------------------------------------------------------------
;questa procedura elimina tutti gli eventi musicali della sequenza selezionata
;this procedure deletes all the events of the selected  sequence
;-----------------------------------------------------------------
Statement EliminaTuttiGliEventiMusicaliDellaSequenza{}
SHARED EventoMusicale()
SHARED Sequenza()
 If Sequenza()\EventiMusicali>0
  ResetList EventoMusicale()
  While NextItem(EventoMusicale())=True
   If EventoMusicale()\Sequenza=Sequenza
    If EventoMusicale()\Stato & #EventoMusicaleSelezionato=#EventoMusicaleSelezionato
     Sequenza()\EventiMusicaliSelezionati-1
    EndIf
    Sequenza()\EventiMusicali-1
    KillItem EventoMusicale()
   EndIf
  Wend
 EndIf
End Statement

;-----------------------------------------------------------
;questa procedura cambia il nome della sequenza selezionata
;this procedure change the selected sequence's name
;---------------------------------------------------
Statement CambiaIlNomeDellaSequenzaSelezionata{}
SHARED Sequenza()
SHARED SequenzaSelezionata
 Use Window #FinestraPrincipale
 WJam #DueColoriConSfondoPieno
 WLocate 0,0:WColour 0,0:Print SPACE$(80)
 WLocate 0,0:WColour 3:Print "Please type the new name for the sequence>"
 NuovoNomeDellaSequenzaSelezionata$=StripLead$(StripTrail$(Edit$("Sequence "+Str$(SequenzaSelezionata),39),Asc(" ")),Asc(" "))
 If NuovoNomeDellaSequenzaSelezionata$<>"" Then Sequenza()\Nome=NuovoNomeDellaSequenzaSelezionata$
 WJam #UnColoreConSfondoTrasparente
End Statement

;---------------------------------------------
;questa procedura mostra la sequenza indicata
;this procedure shows the stated sequence
;-----------------------------------------
Statement MostraSequenza{Nome$,Inizio.l,Durata.l,Traccia,EventiMusicali.l,ModoDisegno.b}
SHARED AltezzaInternaFinestraPrincipale
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza
SHARED TracceVisibili
SHARED XTracceVisibili
SHARED YTracceVisibili
 Y0.w=(Traccia-YTracceVisibili)*8:Y1.w=Y0+7
 If Y0>=8 AND Y1<8+TracceVisibili*8
  Fine.l=Inizio+Durata-1
  I.w=16+Inizio-XTracceVisibili
  F.w=16+Fine-XTracceVisibili
  If I>=16 AND I<LarghezzaInternaFinestraPrincipale
   InizioSequenzaVisibile.b=True
  Else
   InizioSequenzaVisibile=False
  EndIf
  If F>=16 AND F<LarghezzaInternaFinestraPrincipale
   FineSequenzaVisibile.b=True
  Else
   FineSequenzaVisibile=False
  EndIf
  If I<16 AND F>LarghezzaInternaFinestraPrincipale
   SequenzaVisibile.b=True
  Else
   If InizioSequenzaVisibile=True OR FineSequenzaVisibile=True
    SequenzaVisibile=True
   Else
    SequenzaVisibile=False
   EndIf
  EndIf
  If SequenzaVisibile=True
   X0Sequenza.w=Min(Max(I,16),LarghezzaInternaFinestraPrincipale-1)
   Y0Sequenza.w=Min(Max(Y0,8),AltezzaInternaFinestraPrincipale-1-8-8-4-7)
   X1Sequenza.w=Min(Max(F,16),LarghezzaInternaFinestraPrincipale-1)
   Y1Sequenza.w=Min(Max(Y1,8+7),AltezzaInternaFinestraPrincipale-1-8-8-4)
   ColoreSequenza.b=(Sequenza-1) MOD 16
   WBox X0Sequenza,Y0Sequenza,X1Sequenza,Y1Sequenza,ColoreSequenza
   If ModoDisegno=#SequenzaSelezionata
    Wline X0Sequenza,Y0,X1Sequenza,Y1,15-ColoreSequenza
    Wline X0Sequenza,Y1,X1Sequenza,Y0,15-ColoreSequenza
   EndIf
   If ModoDisegno=#SequenzaNonSelezionata
    Wline X0Sequenza+1,Y0Sequenza+1,X1Sequenza-1,Y0Sequenza+1,15-ColoreSequenza
    Wline X0Sequenza+1,Y1Sequenza-1,X1Sequenza-1,Y1Sequenza-1,15-ColoreSequenza
   EndIf
   If ModoDisegno=#SequenzaNonSelezionata
    If InizioSequenzaVisibile=True
     Wline I+1,Y0Sequenza+1,I+1,Y1Sequenza-1,15-ColoreSequenza
    EndIf
    If FineSequenzaVisibile=True
     Wline F-1,Y0Sequenza+1,F-1,Y1Sequenza-1,15-ColoreSequenza
    EndIf
   EndIf
   If Nome$="" Then Nome$="Sequence "+Str$(Sequenza)
   If I>=16 OR I<LarghezzaInternaFinestraPrincipale OR F>=16 OR F<LarghezzaInternaFinestraPrincipale
    WColour 15-ColoreSequenza,ColoreSequenza
    I=Max(I,16):F=Min(F,LarghezzaInternaFinestraPrincipale-1)
    WLocate I,Y0Sequenza:Print Left$(Nome$,(F-I+1)/8)
   EndIf
  EndIf
 EndIf
End Statement

;--------------------------------------------------------------
;questa procedura mostra le sequenze nella finestra principale
;this procedure show the sequences in the main window
;-----------------------------------------------------
Statement MostraLeSequenze{}
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED Sequenza
SHARED Sequenza()
SHARED SequenzaSelezionata
SHARED TracceVisibili
SHARED Traccia()
SHARED XTracceVisibili
SHARED YTracceVisibili
 FineMotivo=0
 Sequenza=0
 PushItem Sequenza()
 ResetList Sequenza()
 While NextItem(Sequenza())=True
  Sequenza+1
  TracciaSequenza.w=Sequenza()\Traccia
  If TracciaSequenza>0
   DurataSequenza.l=Sequenza()\Durata
   If DurataSequenza>0
    PosizioneSequenza.w=(TracciaSequenza-YTracceVisibili)*8
    If PosizioneSequenza>=8 AND PosizioneSequenza<8+TracceVisibili*8
     NomeSequenza$=Sequenza()\Nome
     InizioSequenza.l=Sequenza()\Inizio
     EventiMusicaliSequenza.l=Sequenza()\EventiMusicali
     If Sequenza=SequenzaSelezionata Then ModoDisegno.b=#SequenzaSelezionata Else ModoDisegno=#SequenzaNonSelezionata
     MostraSequenza{NomeSequenza$,InizioSequenza,DurataSequenza,TracciaSequenza,EventiMusicaliSequenza,ModoDisegno}
     FineMotivo=Max(FineMotivo,InizioSequenza+DurataSequenza)
    EndIf
    Traccia(TracciaSequenza-1)=True
   EndIf
  Else
   Traccia(TracciaSequenza-1)=False
  EndIf
 Wend
 PopItem Sequenza()
 For Traccia.b=1 To TracceVisibili
  If Traccia(YTracceVisibili+Traccia-1)=False
   WLocate 16,Traccia*8:WColour 3,0:Print "Track ",Str$(YTracceVisibili+Traccia)," empty"
  EndIf
 Next Traccia
End Statement

Statement MostraSliderFinestraPrincipale{}
SHARED AreaInvisibileDelMotivo
SHARED BattutePerMinuto
SHARED FineMotivo
SHARED LarghezzaInternaFinestraPrincipale
SHARED TracceVisibili
SHARED XTracceVisibili
SHARED YTracceVisibili
;-------------------------------------------------------------------------
;imposta la barra di scorrimento della velocita' di esecuzione delle note
;sets the notes execution velocity slider
;-----------------------------------------
 MostraSlider{1,BattutePerMinuto-10,300-9,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}

;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
 MostraSlider{2,YTracceVisibili,#MassimoTracce-TracceVisibili,"VERTICAL",#ListaGadgetPrincipale,#FinestraPrincipale}

;-------------------------------------
;calcola l'area invisibile del motivo
;evaluate the motive's invisible area
;-------------------------------------
 AreaInvisibileDelMotivo=Max(FineMotivo-(LarghezzaInternaFinestraPrincipale-16),0)

;----------------------------
;mostra le sequenze visibili
;shows the visible sequences
;----------------------------
 MostraSlider{3,XTracceVisibili,AreaInvisibileDelMotivo,"HORIZONTAL",#ListaGadgetPrincipale,#FinestraPrincipale}

End Statement

;*********************************************
;Fine delle procedure ed inizio del programma
;procedures end and program start
;*********************************

;----------------------------------------------------
;questo programma puo' essere lanciato dal Workbench
;this program can be launched from Workbench
;_-------------------------------------------
WBStartup

BlitMode CookieMode

;calculates the frequency and the AMIGA voice period for all the 128 notes
CalcolaLaFrequenzaEdIlPeriodoDelleNote{}

;loads the Topaz8 font
CaricaLaFonteDiCaratteriTopaz8{}

;sets the AMIGA speech
ImpostaIlParlatoDellAmiga{}

;loads note images for the basic event window
CaricaLeImmaginiDelleNote{}

;creates the background bitmap
CreaLaBitmapPerLImmagineDiSfondo{}

;sets the screen
ImpostaLoSchermo{}

;loads the background pic into its bitmap
CaricaLImmagineDiSfondoNellaBitmap{}

;loads the loaded projects history
CaricaLaStoriaDeiProgettiAperti{}

;sets the main window
ImpostaLaFinestraPrincipale{}

;puts the background pic into the main window
MettiLImmagineDiSfondoNellaFinestraPrincipale{}

;shows the main window' sliders
MostraSliderFinestraPrincipale{}

;--------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione delle
; battute per minuto
;copies into memory the measures per minute indication's on screen position
; background
;------------
 CopiaLoSfondoSottoAlleBattutePerMinuto{}

;------------------------------------------------------------------------------
;copia in memoria lo sfondo della posizione a video dell'indicazione del tempo
;copies into memory the time indication's on screen position background
;-----------------------------------------------------------------------
 CopiaLoSfondoSottoAlTempo{}

;shows the sequences
MostraLeSequenze{}

;shows the execution velocity in bar per minute
 MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}

;shows the metronomic time
 MostraIlTempo{(#MisureDiBase-1)*16+#BattitiDiBase-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}

If ParlatoAttivato=True Then Speak "Welcome to AmySequencer!"

;activates MIDI
AttivaMIDI{}

;-----------------
;clclo principale
;main loop
;----------
Repeat

 If SecondoClicDelTopo.b=False
  MettiLImmagineDiSfondoNellaFinestraPrincipale{}
  MostraGliEventiMusicaliDisponibili{}
  MostraLeSequenze{}
  MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
  MostraIlTempo{(Misure-1)*16+Battiti-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
  MostraSliderFinestraPrincipale{}
  SecondoClicDelTopo=True
 EndIf

 If NoteSuonate>0
  If NoteSuonate=1 Then Messaggio$="There is a note" Else Messaggio$="There are "+Str$(NoteSuonate)+" notes"
  Messaggio$+" still playing:|clicking on OK you will stop "
  If NoteSuonate=1 Then Messaggio$+"this." Else Messaggio$+"these."
  EZRequest "AmySequencer message",Messaggio$,"OK"
  InterrompiTutteLeNote{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
  NoteSuonate=0
 EndIf

;--------------------------------------------------------------
;questa variabile cattura gli eventi della finestra principale
;this variable catch main window events
;---------------------------------------
 EventoFinestraPrincipale.l=WaitEvent

 Select EventoFinestraPrincipale

;------------------------------------
;se avete premuto un tasto del mouse
;if you have prssed a mouse button
;----------------------------------
 Case #HaiPremutoUnTastoDelTopo
  XTopo=WMouseX:YTopo=WMouseY:TastoDelTopoCliccato.b=MButtons
  Select TastoDelTopoCliccato
  Case #TastoSinistroDelTopoPremuto
   If YTopo>=8 AND YTopo<8+TracceVisibili*8
    Sequenza=0
    TracciaSelezionata.w=YTopo/8+YTracceVisibili
    ResetList Sequenza()
    While NextItem(Sequenza())=True
     Sequenza+1
     TracciaSequenza.w=Sequenza()\Traccia
     InizioSequenza.l=Sequenza()\Inizio
     DurataSequenza=Sequenza()\Durata
     If DurataSequenza>0
      If TracciaSequenza=TracciaSelezionata
       FineSequenza.l=InizioSequenza+DurataSequenza-1
       I.w=InizioSequenza-XTracceVisibili
       F.w=FineSequenza-XTracceVisibili
       If XTopo>=I AND XTopo<=F
        SequenzaSelezionata=Sequenza
        Pop If:Pop If:Pop If:Pop While:Goto FineCicloWhileUno
       EndIf
      EndIf
     EndIf
    Wend
    LastItem Sequenza()
    If AddItem(Sequenza())=True
     Sequenza()\Traccia=TracciaSelezionata
     Sequenza()\Inizio=XTracceVisibili+XTopo-16
     Sequenza()\Durata=192*4.0/Misure*Battiti
    Else
     EZRequest "AmySequencer message","You have used all|the available sequences","OK"
    EndIf
FineCicloWhileUno
   EndIf
   If YTopo>AltezzaInternaFinestraPrincipale-1-8-8 AND YTopo<AltezzaInternaFinestraPrincipale-8
    If XTopo>LarghezzaInternaFinestraPrincipale-Len("Tempo=00/00")*8
     CambiaLaMisuraDelTempo{}
     MostraIlTempo{(Misure-1)*16+Battiti-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    EndIf
   EndIf
   SecondoClicDelTopo=False
  Case #TastoSinistroDelTopoRilasciato
   SecondoClicDelTopo=True
  End Select
;---------------------------
;se avete premuto un gadget
;if you have pressed a gadget
;-----------------------------
; Case #HaiPremutoUnGadget
;  Select GadgetHit
;  Case 1
;   LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
;   BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
;   TicPerCinquantesimoDiSecondo=BattutePerMinuto*192*4/3000
;  Case 2
;   AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
;   YTracceVisibili=ValoreSlider{2,#MassimoTracce-TracceVisibili,LunghezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
;  Case 3
;   LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
;   XTracceVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
;  End Select
;  SecondoClicDelTopo=False

;------------------------------
;se avete rilasciato un gadget
;if you have released a gadget
;------------------------------
 Case #HaiRilasciatoUnGadget
  Select GadgetHit
  Case 1
   LunghezzaSlider.w=LarghezzaInternaFinestraPrincipale
   BattutePerMinuto=10+ValoreSlider{1,300-9,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
   TicPerCinquantesimoDiSecondo=BattutePerMinuto*192*4/3000
  Case 2
   AltezzaSlider.w=AltezzaSchermo-(AltezzaFonte+3)-8-8-8
   YTracceVisibili=ValoreSlider{2,#MassimoTracce-TracceVisibili,AltezzaSlider,"VERTICAL",#ListaGadgetPrincipale}
  Case 3
   LunghezzaSlider=LarghezzaInternaFinestraPrincipale-16
   XTracceVisibili=ValoreSlider{3,AreaInvisibileDelMotivo,LunghezzaSlider,"HORIZONTAL",#ListaGadgetPrincipale}
  End Select
  SecondoClicDelTopo=False

;--------------------------------------
;se avete attivato il menu' principale
;if you have activated main menu
;--------------------------------
 Case #HaiAttivatoIlMenu
  Select MenuHit
  Case 0
   If ItemHit=1
    CaricaUnProgetto{}
    ImpostaLaFinestraPrincipale{}
   EndIf
  Case 1
   Select ItemHit
   Case 0
    EseguiGliEventiMusicali{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    MostraLeBattutePerMinuto{BattutePerMinuto,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
    MostraIlTempo{(Misure-1)*16+Battiti-1,0,#EseguiGliEventiMusicaliDallaFinestraPrincipale}
   Case 1
    RegistraGliEventiMusicali{#EseguiGliEventiMusicaliDallaFinestraPrincipale}
   End Select
  Case 2
   If SequenzaSelezionata>0
    Select ItemHit
    Case 0
     EditoreSequenza{}
    Case 1
     CambiaIlNomeDellaSequenzaSelezionata{}
    End Select
   Else
    EZRequest "AmySequencer message","You must select a sequence first","OK"
   EndIf
  Case 3
   If ItemHit=0 Then EditoreSuoni{}
  Case 4
   Select ItemHit
   Case 0
    AttivaMIDI{}
   Case 1
    ColoriOriginali=NOT ColoriOriginali
    CaricaLImmagineDiSfondoNellaBitmap{}
    CopiaLoSfondoSottoAlleBattutePerMinuto{}
    CopiaLoSfondoSottoAlTempo{}
   Case 2
    If Exists("ProjectsHistory")
     CancellaLaStoriaDeiProgettiAperti{}
     ImpostaLaFinestraPrincipale{}
    EndIf
   End Select
  End Select

;-------------------------------------------------------------------
;se avete scelto la voce Quit dal menu' Project attiva la variabile
; EsciDalProgramma
;if you have selected voice Quit from Project menu activates EsciDalProgramma
; flag
;------
  If MenuHit=0 AND ItemHit=VoceMenuEsci Then EsciDalProgramma=True

  SecondoClicDelTopo=False

;--------------------------
;se avete premuto un tasto
;if you have pressed a key
;--------------------------
 Case #HaiPremutoUnTasto

;--------------------------------------------
;questa variabile memorizza il tasto premuto
;this variable store the key pressed
;------------------------------------
  TastoPremuto$=Inkey$

  Select TastoPremuto$

;-------------------------------------------------------------------
;se avete premuto il tasto Esc attiva la variabile EsciDalProgramma
;if you have typed Esc key activates EsciDalProgramma flag
;----------------------------------------------------------
  Case TastoEsc$
   EsciDalProgramma=True

  Case TastoBackspace$
   If SequenzaSelezionata>0
    EliminaTuttiGliEventiMusicaliDellaSequenza{}
    TracciaVuota.w=Sequenza()\Traccia
    Sequenza()\Nome=""
    Sequenza()\Traccia=0
    Sequenza()\Inizio=0
    Sequenza()\Durata=0
    KillItem Sequenza()
    ResetList Sequenza()
    TracciaConSequenza.b=False
    While NextItem(Sequenza())
     If Sequenza()\Traccia=TracciaVuota
      TracciaConSequenza=True
      Pop While:Goto FineCicloWhileDue
     EndIf
    Wend
FineCicloWhileDue
    If TracciaConSequenza=False Then Traccia(TracciaVuota-1)=False
    SequenzaSelezionata=0
   Else
    EZRequest "AmySequencer message","You must select a sequence first","OK"
   EndIf
  Case TastoCursoreSu$
   If YTracceVisibili>0 Then YTracceVisibili-1
  Case TastoCursoreGiu$
   If YTracceVisibili<#MassimoTracce-TracceVisibili Then YTracceVisibili+1
  Case TastoCursoreDestra$
   If XTracceVisibili<AreaInvisibileDelMotivo
    XTracceVisibili+LarghezzaEventoBase
    XTracceVisibili=Min(XTracceVisibili,AreaInvisibileDelMotivo)
   EndIf
  Case TastoCursoreSinistra$
   If XTracceVisibili>0
    XTracceVisibili-LarghezzaEventoBase
    XTracceVisibili=Max(XTracceVisibili,0)
   EndIf
  End Select
  SecondoClicDelTopo=False

 End Select

;----------------------------------------------------------------
;ripete il ciclo se la variabile EsciDalProgramma e' disattivata
;repeats loop if EsciDalProgramma flag is deactivated
;-----------------------------------------------------
Until EsciDalProgramma=True

;----------------------
;fine del programma
;program end
;------------
End
